Spring 梳理-MVC-配置DispatcherServet和ContextLoaderListener

  1. 在使用JavaConfig时,AbstractAnnotationConfigDispatcherServletInitializer会自动注册 DispatcherServlet 和 ContextLoaderListener
  2. ContextLoaderListener使用全局参数“contextConfigLocation”指定的xml文件完成加载
  3. DispatcherServet会根据Servlet的名字找到一个文件,并基于该文件加载应用上下文。若特殊命名,可使用局部参数“contextConfigLocation”进行指定,如下文所示。
  4. 当Spring在执行ApplicationContext的getBean时,如果在自己context中找不到对应的bean,则会在父ApplicationContext中去找。这也解释了为什么我们可以在DispatcherServlet中获取到由ContextLoaderListener对应的ApplicationContext中的bean。
  5. 这两个ApplicationContext都是通过ServletContext的setAttribute方法放到ServletContext中的。从web.xml的配置可知ContextLoaderListener会先于DispatcherServlet创建ApplicationContext,DispatcherServlet在创建ApplicationContext时会先找到由ContextLoaderListener所创建的ApplicationContext,再将后者的ApplicationContext作为参数传给DispatcherServlet的ApplicationContext的setParent()方法,作为它的父上下文
  6. 对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext,而反过来不行。
  7. ContextLoaderListener中创建ApplicationContext主要用于整个Web应用程序需要共享的一些组件,比如DAO,数据库的ConnectionFactory等。而由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。
    1.   
  8. 从图中可以看出:
    ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;ContextLoaderListener一般会加载整个Spring容器相关的bean配置管理(如: Log, Service, Dao, PropertiesLoader, DataSource Bean, etc.)

    1.   ContextLoaderListener继承ContextLoader类,实现ServletContextListener接口(该接口监听servlet容器的启动和销毁),ContextLoaderListener重写了监听容器启动和销毁的方法,在启动时(contextInitialized),会调用initWebApplicationContext方法,进行web容器初始化。

  9. DispatcherServlet一般会加载MVC相关的bean配置管理(如: ViewResolver, Controller, MultipartResolver, ExceptionHandler, etc.)

    1.  

        DispatcherServlet本质是一个servlet,能够拦截请求

    2. servlet会有初始化init,会进行一些初始化操作:
      
      protected void initStrategies(ApplicationContext context) {
             //初始化多部请求解析器,没有默认的实现 
                      initMultipartResolver(context); //文件上传
                      //初始化地域解析器,默认实现是AcceptHeaderLocaleResolver  
                      initLocaleResolver(context);  
                       //初始化主题解析器,默认实现是FixedThemeResolver  
                      initThemeResolver(context);  
                       //初始化处理器映射,这是个集合, 默认实现是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping   
                      initHandlerMappings(context);  
                       //初始化处理器适配器,这是个集合,默认实现是HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter    
                      initHandlerAdapters(context);  
                        //初始化处理器异常解析器,这是个集合,默认实现是AnnotationMethodHandlerExceptionResolver,ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver   
                      initHandlerExceptionResolvers(context);  
                      //初始化请求到视图名解析器,默认实现是DefaultRequestToViewNameTranslator    
                      initRequestToViewNameTranslator(context);  
                      //初始化视图解析器,这是个集合,默认实现是InternalResourceViewResolver    
                      initViewResolvers(context);   
      }

       

  10. 如果分开配置,则web.xml

  11. 配置
    1.   
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app  version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"  
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                                                  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
              
           <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/applicationContext.xml</param-value>
              <!-- 默认是/WEB-INF/applicationContext.xml,设置根上下文配置文件的位置 -->
           </context-param>
           
           <listener>
              <listener-class>
                  org.springframework.web.context.ContextLoaderListener
              </listener-class>
           </listener>
        
          <servlet>
              <servlet-name>SpringMVC</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>/WEB-INF/SpringMVC-servlet.xml</param-value>
                  <!-- 默认是/WEB-INF/[servlet名字]-servlet.xml -->
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
          
          <servlet-mapping>
              <servlet-name>SpringMVC</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
        
      </web-app>

       

  12. 在大型应用中可使用如下配置
    1. <?xml version="1.0" encoding="UTF-8" ?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns="http://java.sun.com/xml/ns/javaee"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
               version="2.5">
      
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <description>加载/WEB-INF/spring/目录下的所有XML作为Spring MVC的配置文件</description>
                  <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/applicationContext.xml,classpath*:com/jt/**/spring.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

       

posted on 2018-09-26 21:08  手握太阳  阅读(443)  评论(0编辑  收藏  举报

导航