传统Spring应用程序的启动过程
一 Spring应用程序的启动过程,本质上是ioc容器的启动过程:
(1)创建ioc容器实例(ApplicationContext、BeanFactory)
(2)读取配置文件或配置类、解析配置信息、注册Bean定义
(3)完成Bean的实例化、初始化
(4)ioc容器就绪、关闭
二 传统Spring web应用程序的启动过程
web程序,有一个核心配置文件web.xml,一般有以下核心配置。
<!--spring资源上下文定义,在指定地址找到spring的xml配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/application_context.xml</param-value>
</context-param>
<!--spring的上下文监听器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--dispatcherServlet的配置,这个servlet主要用于前端控制,这是springMVC的基础-->
<servlet>
<servlet-name>service_dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/services/service_dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Spring Web程序的启动过程,本质上是ServletContext容器的启动过程:
-
读取web.xml文件
-
创建ServletConext实例
-
完成WebApplicationContext的创建和初始化
-
将WebApplicationContext放入ServletContext
-
初始化web.xml文件中配置的servlet
源码解读,建议从ContextLoaderListener.java类的ContextInitialized方法开始。
详细过程解读:在web.xml文件中配置了spring的上下文监听器,在web容器(如tomcat)启动时,会触发容器初始化事件。ContextLoaderListener监听到这个事件后,触发ContextInitialized方法完成上下文初始化,这个方法调用父类中ContextLoader的方法(createWebApplicationContext、configureAndRefreshWebApplicationContext)与setAttribute完成上下文初始化。ServletContext初始化完成后,开始初始化servlet。
ContextLoader类中主要完成三件事:
-
通过createWebApplicationContext方法创建WebApplicationContext
-
通过configureAndRefreshWebApplicationContext方法完成读取配置文件、Bean的实例化与初始化,、WebApplicationContext的初始化
-
通过setAttribute完成ServletContext的初始化。