zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    QT多重继承的时候,要把QObject放在最前面,否则报错——C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样
    动态库的搜索路径
    载入OpenSSL的动态库——学会使用tryToLoadOpenSslWin32Library和QPair
    Physical Standby Database Failover
    ARM和X86功耗差别的深层原因探讨
    Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数
    QT---线程间通信
    Qt :非window子窗体的透明度设置
    QT:给Widget设置背景图片——设置Widget的调色板,调色板使用图片和背景色
    用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用
  • 原文地址:https://www.cnblogs.com/jiangtao1218/p/9709728.html
Copyright © 2011-2022 走看看