一、场景引入
在web项目中,用到spring框架必然需要配置web.xml中的如下内容:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
知识准备:
1.servlet的配置中的load-on-startup意义
servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。
init 方法是随 Servlet 实例化而被调用的,因为 load-on-startup 就是用来设置 Servlet 实例化时间的。
二、DispatcherServlet分析
1. 体系结构:
从图中的继承关系,发现DispatchServlet.init()在其父类(HttpServletBean)做了实现,下面我们看看HttpServletBean.init()做了什么
2.HttpServletBean.init()流程
1.读取servletConfig即将 <init-param>中的配置参数封装为PropertyValues
2.包裹DispatcherServlet对象为BeanWrapper(目的:为这个对象增加一些属性)
3.根据servletContext获取ResourceLoader
4.为第二步的BeanWrapper注册定制的编辑器???
5.初始化servletBean
5.1创建applicationContext并且将其存入servletContext中
大体就是创建XmlWebApplicationContext 并且设置父上下文(即父子容器)