<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener
是一个实现了ServletContextListener
接口的监听器,在启动项目时会触发contextInitialized
方法(该方法主要完成ApplicationContext
对象的创建),在关闭项目时会触发contextDestroyed
方法(该方法会执行ApplicationContext
清理操作),由该监听器创建并初始化IOC容器
该监听器,默认读取/WEB-INF/下的applicationContext.xml文件。但是通过context-param指定配置文件路径后,便会去指定的路径下读取对应的配置文件,并进行初始化。
ServletContextListener
:用于接收关于ServletContext
生命周期更改的通知事件的接口
项目启动时触发contextInitialized()方法创建Spring上下文:
public void contextInitialized(ServletContextEvent event) {
this.initWebApplicationContext(event.getServletContext());
}
spring上下文容器配置后,初始化了什么?
- servlet容器启动,为应用创建一个“全局上下文环境”:ServletContext
- 容器调用web.xml中配置的contextLoaderListener,初始化WebApplicationContext上下文环境(即IOC容器),加载context-param指定的配置文件信息到IOC容器中。WebApplicationContext在ServletContext中以键值对的形式保存
- 容器初始化web.xml中配置的servlet,为其初始化自己的上下文信息servletContext,并加载其设置的配置信息到该上下文中。将WebApplicationContext设置为它的父容器。
- 此后的所有servlet的初始化都按照3步中方式创建,初始化自己的上下文环境,将WebApplicationContext设置为自己的父上下文环境。初始化完毕后,spring以与servlet的名字相关的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即contextConfigLocation配置的bean。
对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext中的内容,而反过来不行。
网友评论