SpringMvc DispatchServlet各版本初始化
關於SpringMvc dispatchServlet配置
接手過三個不同方式的web專案,spring mvc 配置各有不同,整理一下
- * 1.基於web.xml方式*
- 2.基於servlet3.0 註解配置方式
- 3.spring boot 啟動方式
1.基於web.xml方式
最早的方式,基於web.xml配置,通過配置DispatcherServlet實現初始化,如果需要配置spring,另外新增spring ContextLoaderListener,存在雙親上下文的問題
spring 監聽器配置
<listener>
< listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
spring mvc DispatcherServlet配置
<servlet>
<servlet-name>demoDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class >
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/META-INF/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported >
</servlet>
2.基於servlet3.0 註解配置方式
基於註解配置spring mvc,不需要再配置web.xml,程式碼及原理如下:
1.實現方式,自定義WebAppInitializer繼承
package ;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.util.IntrospectorCleanupListener;
import com.ly.fn.biz.fq.hybrid.config.ContextConfig;
import com.ly.fn.biz.fq.hybrid.config.ServletConfig;
import com.ly.fn.inf.trace.client.web.CatFilter;
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { ContextConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { ServletConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected void registerContextLoaderListener(ServletContext servletContext) {
servletContext.addListener(new IntrospectorCleanupListener());
super.registerContextLoaderListener(servletContext);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
DelegatingFilterProxy delegateFilter = new DelegatingFilterProxy();
FilterRegistration.Dynamic reg = servletContext.addFilter("filters", delegateFilter);
reg.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/*");
}
}
2.配置相關元件,同以前的spring-servlet.xml配置
package ;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "", includeFilters = {
@Filter(Controller.class), @Filter(ControllerAdvice.class), @Filter(RestController.class) })
public class ServletConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
}
@Override
public Validator getValidator() {
OptionalValidatorFactoryBean optional = new OptionalValidatorFactoryBean();
optional.setProviderClass(HibernateValidator.class);
return optional;
}
@Bean
@Autowired
public SpringTemplateEngine templateEngine(Set<ServletContextTemplateResolver> templateResolver,
Set<IDialect> layoutDialect) {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setAdditionalDialects(layoutDialect);
engine.setTemplateResolvers(templateResolver);
return engine;
}
@Bean
public IDialect infDialect() {
return new InfDialect();
}
@Bean
public ServletContextTemplateResolver templateResolver_views() {
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setCacheable(false);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
@Autowired
public ThymeleafViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(0);
return resolver;
}
@Bean
public RpcwiredAutoInjectionProcessor rpcwiredProcessor() {
return new RpcwiredAutoInjectionProcessor();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new FormHttpMessageConverter());
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
super.configureContentNegotiation(configurer);
configurer.defaultContentTypeStrategy(new DefaultContentNegotiationStrategy());
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/nohup.html").setStatusCode(HttpStatus.OK).setViewName("nohup");
}
3.啟動原理
servlet 3.0 下容器啟動後會通過java spi 機制尋找ServletContainerInitializer實現類,
該配置在spring-web jar 包META-INF下
檔案內容
org.springframework.web.SpringServletContainerInitializer
開啟該類,我們會發現其實現了onStartup方法
package org.springframework.web;
import java.lang.reflect.Modifier;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
if (webAppInitializerClasses != null) {
for (Class<?> waiClass : webAppInitializerClasses) {
// Be defensive: Some servlet containers provide us with invalid classes,
// no matter what @HandlesTypes says...
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer) waiClass.newInstance());
}
catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
return;
}
servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}
@HandlesTypes(WebApplicationInitializer.class)
onStup方法根據類上的註解找到所有改型別的類作為引數傳入,而我們的前面定義的AppInitializer也實現了該介面,
initializers.add((WebApplicationInitializer) waiClass.newInstance());
最終此處例項化我們自定義的啟動類,並且在後面執行onStartUp方法
AbstractDispatcherServletInitializer.onStartup中執行了相關servlet的註冊registerDispatcherServlet(servletContext);
3.spring boot 方式
篇幅過長,另寫
相關推薦
SpringMvc DispatchServlet各版本初始化
關於SpringMvc dispatchServlet配置 接手過三個不同方式的web專案,spring mvc 配置各有不同,整理一下 * 1.基於web.xml方式* 2.基於servlet3.0 註解配置方式 3.spring boot 啟
springmvc中配置servlet初始化類
調用 靜態類 its tomcat -m class cat 讀取 gmv <bean id="InitStart" lazy-init="false" init-method="InitSystem" class="my.spring.uitl.InitStart
SpringMVC原始碼分析--容器初始化(四)FrameworkServlet
一下SpringMVC配置檔案的地址contextConfigLocation的配置屬性,然後其呼叫的子類FrameworkServlet的initServletBean方法。 其實FrameworkServlet是springMVC初始化IOC容器的核心,通過讀取配置的c
SpringMVC之淺析元件初始化過程
/** Well-known name for the MultipartResolver object in the bean factory for this namespace. */ public static final String MULTIPART_RESOLVER_BEAN_NAME =
springMVC原始碼分析--容器初始化(一)ContextLoaderListener
在spring Web中,需要初始化IOC容器,用於存放我們注入的各種物件。當tomcat啟動時首先會初始化一個web對應的IOC容器,用於初始化和注入各種我們在web執行過程中需要的物件。當tomcat啟動的時候是如何初始化IOC容器的,我們先看一下在web.xml中經常看
SpringMVC原始碼分析--容器初始化(五)DispatcherServlet
上一篇部落格SpringMVC原始碼分析--容器初始化(四)FrameworkServlet我們已經瞭解到了SpringMVC容器的初始化,SpringMVC對容器初始化後會進行一系列的其他屬性的初始化操作,在SpringMVC初始化完成之後會呼叫onRefresh(wac
SpringMVC原始碼分析--容器初始化(三)HttpServletBean
在上一篇部落格 springMVC原始碼分析--容器初始化(二)DispatcherServlet中,我們隊SpringMVC整體生命週期有一個簡單的說明,並沒有進行詳細的原始碼分析,接下來我們會根據部落格中提供的springMVC的生命週期圖來詳細的對SpringMVC的
eclipse各版本漢化說明
這邊只介紹從eclipse中漢化,用 link 方式漢化這邊暫時不做介紹。 1、我們先來看一下你自己當前eclipse的版本,開啟eclipse選單欄中的help選單中的 About Eclipse: 出現如下視窗,裡面就有eclipse的版本資訊了,如下圖: 2、接著
各大網站css初始化代碼
-a vertica orm borde zoom 初始化 nor color back · 雅虎工程師提供的CSS初始化示例代碼 body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,c
SpringMVC源碼解析-DispatcherServlet啟動流程和初始化
instant custom delegate bean 自己的 erro -- true long 在使用springmvc框架,會在web.xml文件配置一個DispatcherServlet,這正是web容器開始初始化,同時會在建立自己的上下文來持有Spring
springmvc初始化數據
java springmvc initializingbean 在使用springmvc時,我們也會在項目啟動時初始化一些數據,具體的方式見下面的鏈接。這裏我只貼一下InitializingBean的例子。註意事項:springmvc和sping整合時,配置註解的註意事項!不註意會導致我們的con
SpringMVC(一)--SpringMVC的初始化和流程
設計 splay 上傳 app color 完成 關系 handler 數據庫 SpringMVC是Spring提供給WEB應用的MVC框架,MVC框架一般來說由三部分組成: Model:模型層,一般由java bean完成,主要是進行數據庫操作; View:視圖層
SpringMvc HandlerMappings 何時初始化?
col abstract tst bsp strong and hand 什麽 cat SpringMvc 的轉發控制器 DispatcherServlet 執行 initStrategies(),在什麽時候初始化 HandlerMappings ? 在容器 Abstra
SpringMvc HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪裏初始化的 ?
strong alt map gmv let 哪裏 spring handle pri HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪裏初始化的
Eclipse漢化教程(各版本通用)
Eclipse漢化教程 1. 確定Eclipse的版本 方法一:開啟eclipse,在啟動畫面 中可以看到eclipse的版本名稱(我的版本是Photon),記住這個版本的名稱; 方法二:在Eclipse啟動後,點選選單欄中的Help(幫助)>>Abo
spring原始碼學習(5.1.0版本)——Bean的初始化(中)
目錄 前言 createBean 有自定義TargetSource代理類的生成 resolveBeforeInstantiation applyBeanPostProcessorsBeforeInstantiation postProcessBeforeIn
spring原始碼學習(5.1.0版本)——Bean的初始化(上)
目錄 前言 源頭 preInstantiateSingletons方法 getBean(String beanName) doGetBean getObjectForBeanInstance getObjectFromFactoryBean doGe
Springmvc web專案初始化
Web容器首先會讀取專案中的web.xml配置檔案中的兩個節點:<context-param>與<listener> Web容器建立ServletContext物件即Servlet上下文,ServletContext代表整個應用,是Servle
【SpringMvc】從零開始學SpringMvc之初始化(一)
大家好,我們今天開始SpringMvc 這個系列,由於筆者也是安卓出身,對SpringMvc 也是接觸不久,所以,這個系列僅僅只是記錄筆者學習SpringMvc 過程中的心得,如有錯誤,歡迎指正。 在開始之前,我們需要準備一些東西,JDK、Eclipse(MyEclipse)、Tom
SpringmvcDay01(配置springmvc適配對映,初始化)
springmvc的基礎知識 springmvc框架原理 前端控制器、處理器對映器、處理器介面卡、檢視解析器 springmvc入門程式 目的:對前端控制器、處理器對映器、處理器介面卡、檢視解析器 非註解的處理器對映器、處理器介面卡 註解的處理器對映器、處理器