原文地址:http://blog.csdn.net/zghwaicsdn/article/details/51186915

ContextLoaderListener监听器,加载ROOT WebApplicationContext

1.在web.xml配置监听器

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
ContextLoaderListener监听器继承了ServletContextListener接口,ServletContextListener监听器提供了
web容器启动时,初始化ServletContext后的事件监听,和销毁ServletContext前的事件监听。

ContextLoaderListener在初始化ServletContext后进行了WebApplicationContext的初始化,在销毁ServletContext前进行了WebApplicationContext的销毁。

ContextLoaderListener初始化WebApplicationContext都做了什么工作?

1.WebApplicationContext实现类的查找
    spring允许你配置WebApplicationContext实现类.
  1)如果在web.xml中配置了ServletContext的初始化参数,其中名字为contextClass,则代表你配置了相应的WebApplicationContext容器实现类,例如:
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.XmlWebApplicationContext</param-value>
    </context-param>
  2)如果没有在web.xml中配置WebApplicationContext实现类,则查找classPath下存在的默认配置文件ContextLoader.properties属性文件,这个文件在static
  静态域中初始化,具体配置如下:
    org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
得到实现类的类名,并使用反射得到该类型,并实例化该对象,这样就得到WebApplicationContext实例。
这里默认使用XmlWebApplicationContext作为WebApplicationContext实例。

2.配置XmlWebApplicationContext
1.设置ServletContext
2.设置spring配置文件资源路径,在web.xml配置了,容器在刷新时会使用这些配置来加载bean及设置
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/springmvc.xml;/WEB-INF/spring/*</param-value>
    </context-param>
如果没有配置则使用/WEB-INF/applicationContext.xml
3.配置环境变量,除了标准的运行环境参数System.getEnv()和System.getProperties(),spring还设置了一个环境变量,
servletContextInitParams 值为当前的ServletContext

4.支持配置XmlWebApplicationContext在刷新前,实现接口ApplicationContextInitializer
实现initialize(XmlWebApplicationContext applicationContext)方法
需要在web.xml中配置
     <context-param>
        <param-name>globalInitializerClasses</param-name>
        <param-value>com.zghw.springmvc.demo.MyApplicationContextInitializer</param-value>
    </context-param>
    <context-param>
        <param-name>contextInitializerClasses</param-name>
        <param-value>com.zghw.springmvc.demo.MyApplicationContextInitializer1</param-value>
    </context-param>
globalInitializerClasses代表所有的web application都会应用
contextInitializerClasses代表只有当前的web application会使用
如果存在把这些实现类作为一个集合,转化为class类型,并实例化对象,排序调用initialize方法。
5.刷新容器,wac.refresh();
主要的一步:把容器加入到ServletContext ,让容器依附于Web容器。放入容器的名称为org.springframework.web.context.WebApplicationContext.ROOT
然后把当前线程类加载器和WebApplicationContext绑定在一个map中,以便以后取用。

总结:
Web容器启动时,ContextLoaderListener实现了ServletContextListener接口,即在Servlet初始化阶段,会通知ContextLoaderListener监听器,初始化
Context容器,这里使用到了ServletContext的初始化参数。即在web.xml配置的context-param
1.首先查找配置的WebApplicationContext实例,通过默认配置或用户在web.xml配置的contextClass实现类,并实例化对象这里使用的是XmlWebApplicationContext。
2.获取容器加载的配置文件,contextConfigLocation
3.设置web的环境参数servletContextInitParams 值为当前的ServletContext
4.实现了ApplicationContextInitializer接口用来初始化容器设置,并配置在了globalInitializerClasses或contextInitializerClasses,转化为class类型,并实例化对象,排序调用initialize方法。
5.刷新容器,wac.refresh();IOC容器加载配置,解析BeanDefintion,初始化配置,运行部分处理器等等一系列工作。
6.让IOC容器放入ServletContext中,作为Root容器名称为:org.springframework.web.context.WebApplicationContext.ROOT
7.把当前线程的类加载和当前IOC容器WebApplicationContext绑定在一个map中,以便以后取用。

DispatcherServlet Web容器启动初始化

HttpServletBean抽象类继承HttpServlet,实现了EnvironmentCapable, EnvironmentAware
1.初始化方法
  1.ServletConfig:把ServletCofig中的参数放入到PropertyValues这个属性管理对象中进行管理,并验证使用此Servlet必须要的参数。ServletCofig中如果没有必要的参数则抛出异常。这些必要的参数通过钩子方法让子类加入属性参数。
  2.包装当前的Servlet实现类(DispatcherServlet)作为一个BeanWrapper.并赋予ResourceEditor编辑器,用来处理Servlet中的字符串属性转换为Resource对象,这个Resource
  实现类是ServletContextResource它使用ServletContext来解析路径,使用了ServletContextResourceLoader资源加载器来加载。
  3.设置钩子方法initBeanWrapper让子类为这个Servlet实例BeanWrapper设置配置,比如设置属性编辑器,类型转换器等。
  4.设置Servlet实例BeanWrapper的属性即包含了ServletConfig参数和设置的一些属性值的PropertyValues。
  5.设置钩子方法initServletBean让子类为这个Servlet设置需要的。
2.销毁方法
 空实现,让子类实现
3.环境
实现EnvironmentAware接口代表IOC容器自动注入环境:void setEnvironment(Environment environment);注入ConfigurableEnvironment
实现EnvironmentCapable接口代表了可以得到容器环境,如果容器没有设置环境environment 则设置为StandardServletEnvironment

HttpServletBean主要是设置ServletConfig转化为PropertyValues中,并初始化当前Servlet为BeanWrapper对象。还设置了环境变量。

FrameworkServlet抽象类继承HttpServletBean ,实现了ApplicationContextAware

实现ApplicationContextAware接口代表了容器自动注入IOC容器ApplicationContext,但这里处理仅仅是ApplicationContext是WebApplicationContext实例,并且WebApplicationContext空时才用。

FrameworkServlet主要为了初始化一个新的WebApplicationContext,它使用了ROOT下的WebApplicationContext作为初始,这个可以从ServletContext中取得,
因为在ServletContext监听器初始化阶段已经把ROOTWebApplicationContext加入到ServletContext属性中。
拿到ROOT WebApplicationContext作为一个新的Servlet WebApplicationContext并设置ROOT为父容器,达到了双亲委派模式,
并追加了一些servletConfig 命名空间等参数配置。
配置的DispathcerServlet可以有多个,则代表会有不同的命名空间,格式为在web.xml中配置的servlet的名字追加-servlet
比如<servlet-name>springmvc</servlet-name>则命名空间为springmvc-servlet

IOC容器已经初始化完成可以使用了。
然后调用DispatcherServlet的方法onRefresh(ApplicationContext context)
进行MVC的配置bean初始化,以便使用。

把下列接口实现类的实例作为属性加入到DispatcherServlet中,或者从配置中加载的或使用默认的配置的。
 MultipartResolver
 LocaleResolver
 ThemeResolver
 HandlerMapping
 HandlerAdapter
 HandlerExceptionResolver
 RequestToViewNameTranslator
 ViewResolver
 FlashMapManager

上传文件解析器
MultipartResolver 默认是没有配置的
直接通过IOC容器ApplicationContext来查找是否存在配置的MultipartResolver.class类型的bean。
如果存在bean作为属性设置到DispatcherServlet中,没有就不用

国际化解析器
LocaleResolver 默认是AcceptHeaderLocaleResolver
直接通过IOC容器ApplicationContext来查找是否存在配置的LocaleResolver.class类型的bean。
如果存在bean作为属性设置到DispatcherServlet中,没有bean,就查询DispatcherServlet.properties中配置的
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
同样会把该AcceptHeaderLocaleResolver作为bean放入到IOC容器中。

主题解析器
ThemeResolver 默认为FixedThemeResolver
和上面LocaleResolver处理一样org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

映射处理类
HandlerMapping 默认:BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping

1.从ApplicationContext IOC容器中,查询单例HandlerMapping.class类型的bean,包含从父工厂查找。
查找的所有HandlerMapping放入到Map对象中。
2.把包含HandlerMapping的Map转化成集合,然后对HandlerMapping集合排序,并把此集合作为属性保存在servlet中。
3.
如果说bean工厂中未配置HandlerMapping,则使用默认策略,从DispatcherServlet.properties文件中,
取出org.springframework.web.servlet.HandlerMapping配置的默认HandlerMapping类名
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
通过配置的类名,查询对应的Class类型,并通过IOC创建一个实例对象,比如BeanNameUrlHandlerMapping,
上面配置了两个HandlerMapping实现类名,则ApplicationContext有两个HandlerMapping实例。

处理器适配器接口
HandlerAdapter 默认HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter
和HandlerMapping查找同样的逻辑步骤
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

处理异常解析器
HandlerExceptionResolver 默认AnnotationMethodHandlerExceptionResolver、ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver
和HandlerMapping查找同样的逻辑步骤
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
请求到视图翻译解析器
RequestToViewNameTranslator 默认的是DefaultRequestToViewNameTranslator
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

视图解析器

ViewResolver 默认 InternalResourceViewResolver
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

FlashMap管理器
FlashMapManager 默认是 SessionFlashMapManager
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

总结:
从IOC容器中查找相应的配置,如果查找不到,就使用DispatcherServlet.properties默认配置并把配置的类型加入到IOC中作为Bean。

web容器启动加载WebApplicationContext和初始化DispatcherServlet的更多相关文章

  1. java web项目启动加载顺序

    转载:https://www.cnblogs.com/writeLessDoMore/p/6935524.html web.xml加载过程(步骤):       1.启动WEB项目的时候,容器(如:T ...

  2. servlet 启动加载配置文件及初始化

    在servlet开发中,会涉及到一些xml数据的读取和一些初始化方法的调用.可以在tomcat启动的时候,加载一个servlet去初始化一些数据. 摘自 http://stone02111.iteye ...

  3. Spring的web应用启动加载数据字典方法

    在一个基于Spring的web项目中,当我们需要在应用启动时加载数据字典时,可写一个监听实现javax.servlet.ServletContextListener 实现其中的contextIniti ...

  4. java web程序启动加载 ContextLoaderListener

    浅析ContextLoaderListener 大家可能对下面这段代码再熟悉不过了 <context-param> <param-name>contextConfigLocat ...

  5. 手写web框架之加载Controller,初始化框架

    1,加载Controller     我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:      通过ClassHelper我们可以获取所有定义了Controller注解的 ...

  6. redis启动加载过程、数据持久化

    背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类 ...

  7. WEB容器启动——web.xml加载详解

    最近在看spring的源码,关于web.xml文件在容器(Tomcat.JBOSS等)启动时加载顺序问题很混乱,通过搜集资料,得出以下的结论: 1.加载顺序与它们在 web.xml 文件中的先后顺序无 ...

  8. Spring在Web容器启动时执行初始化方法

    需求:在tomcat启动时开启一个定时任务. 想法:容器启动时执行方法,最容易想到的就是servlet中可以配置load-on-startup,设置一个正整数也就可以随容器一起启动. 问题:上面的方法 ...

  9. spring源码:web容器启动(li)

    web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...

随机推荐

  1. js遍历数组随机返回指定的数组结果

    ////随机生成数组中自定义的个数返回一个字符串数组    function getArrayItems(arr, num) {        //新建一个数组,将传入的数组复制过来,用于运算,而不要 ...

  2. okhttp同步请求流程和源码分析

    在上一次[http://www.cnblogs.com/webor2006/p/8022808.html]中已经对okhttp的同步与异步请求的基本使用有了一了初步了解,这次来从源码的角度来分析一下同 ...

  3. java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

    Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...

  4. 安装theano遇到的问题

    嗯,听说keras虽然说有TensorFlow有backend就够了,在TensorFlow和theano之间来回切换还是会有用的,然后又补安装了theano 之前解了权限了,所以不需要sudo 直接 ...

  5. p1268树的重量 题解

    题面描述点此qwq. 正解开始. 一道茅塞顿开恍然大悟的题目: 第一眼看到这个题的时候,语文不好的我对着题目中的 这些,和: 这句话发呆半天,,,, 因为不关我怎么构建几何模型,我都不理解这句话.. ...

  6. 同一电脑如何安装多个jdk

    1.安装对应的jdk 本机测试只安装jdk1.7和1.8 2.切换jdk 以我的环境为例,一开始装的是jdk1.7,要切换到jdk1.8时,需修改以下内容 环境变量,该为对应jdk的bin路径 修改注 ...

  7. springcloud实践(三)之断路器:Hystrix

    服务雪崩效应 基础服务的故障导致级联故障,进而造成了整个分布式系统的不可用,这种现象被称为服务雪崩效应.服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程. ...

  8. 常见https,SSH协议和MD5加密方式分析

    前言 https,SSH协议和MD5加密是前端可能会接触到的加密,所以我就将他们进行了一个归纳. 1.https 1.1原理 A.就是在http加入SSL层,是http安全的基础;B.htts协议是在 ...

  9. MariaDB使用enum和set

    1.enum 单选字符串数据类型,适合存储表单界面中的“单选值”. 设定enum的时候,需要给定“固定的几个选项”:存储的时候就只存储其中的一个值. 设定enum的格式: enum("选项1 ...

  10. VMware中出现物理内存不足,无法使用配置的设置开启虚拟机解决方案

    前几天给大家分享了如何在VMware中安装CentOS系统,后来有小伙伴在群里咨询,当新建虚拟机之后,打开虚拟机会弹出“物理内存不足,无法使用配置的设置开启虚拟机”的问题,如下图所示.这里会给出提示, ...