1. 程式人生 > >SpringMvc DispatchServlet各版本初始化

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入門程式 目的:對前端控制器、處理器對映器、處理器介面卡、檢視解析器 非註解的處理器對映器、處理器介面卡 註解的處理器對映器、處理器