Spring加载机制
启动过程
在一个基于springmvc的web应用中,需要有一个web容器,一般我们用tomacat,这个web容器提供了一个全局的上下文环境ServletContext,同时也是Spring IoC容器的宿主环境。
宿主容器启动时,其入口文件便是web.xml。web.xml需要定义两个最基本的内容,ContextLoaderListener和DispatcherServlet。
1、ContextLoaderListener是实现了ServletContextListener接口的监听器,在项目启动的时候会触发容器初始化方法contextInitialized,容器初始化方法主要做3个事情
(1)执行initWebApplicationContext方法,启动一个上下文 WebApplicationContext 的接口类,其实现类为XmlWebApplicationContext(即传说的IOC容器)。
<!-- 定义监听器,监听项目的启动和关闭,执行对应的方法 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
(2)根据配置路径加载spring文件创建Bean的实例,这些bean都放入XmlWebApplicationContxt容器中。
<!-- 加载Spring配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-context*.xml </param-value> </context-param>
(3)将加载好Bean实例的WebApplicationContext按指定的key注册到ServletContext(Java Web全局变量宿主容器)容器中去
2、contextLoaderListener监听器监听容器初始化完成之后,开始初始化web.xml中配置的Servlet(可以配置多个),springmvc中以DispatcherServlet为例。DispatcherServlet,前端控制器,也可以叫请求分发控制器,用来接收、匹配、处理、转发每个servlet请求。DispatcherServlet会以WebApplicationServlet作为自己的parent上下文,然后再初始化自己的上下文。DispatcherServlet初始化上下文主要包括处理器映射器,处理器适配器,视图解析器等。最后再将初始化完成的Servlet注册到ServletContext中,这样每个Servlet都可以持有自己的上下文,同时又能共享根上下文,即IOC容器上下文WebApplicationContext。
<servlet> <servlet-name>spring3mvc</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】https://zhuanlan.zhihu.com/p/62979297
【2】https://blog.csdn.net/u011246915/article/details/82716009