contextloaderlistener
对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 contextloaderlistener,如下。
<!-- 加载spring上下文信息,最主要的功能是解析APPlicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置applicationContext.xml的位置路径,让ContextLoaderListener进行加载该配置文件,并解析 -->
<context-param>
<param-name>contextconfiglocation</param-name>
<param-value>classpath:applicationContext.xml
</param-value>
</context-param>
ContextLoaderListener有什么用?提供什么功能呢?我们下面通过源码分析下。
ContextLoaderListener 源码分析
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
public ContextLoaderListener() {
}
public ContextLoaderListener(webapplicationContext context) {
super(context);
}
//web 容器启动时执行
@Override
public void contextInitialized(ServletContextEvent event) {
//初始化WebApplicationContext对象
initWebApplicationContext(event.getServletContext());
}
//web容器销毁时执行
@Override
public void contextDestroyed(ServletContextEvent event) {
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
}
ContextLoaderListener 实现了ServletContextListener 接口。
ServletContextListener 接口我们知道是web容器创建的时候开始执行contextInitialized() 方法,web容器销毁时执行contextDestroyed() 方法。那我们就从contextInitialized() 方法开始分析。
contextInitialized() 方法
public void contextInitialized(ServletContextEvent event) {
//初始化WebApplicationContext对象
initWebApplicationContext(event.getServletContext());
}
initWebApplicationContext() 方法
- 首先判断servletContext中是否存在WebApplicationContext实例,如果存在说明ServletContextListener在web.xml中多次声明,并抛出异常。
- 调用 createWebApplicationContext() 方法创建WebApplicationContext实例
- 调用configureAndRefreshWebApplicationContext() 方法通过WebApplicationContext进行解析web.xml中配置的applicationContext.xml。
- 把WebApplicationContext实例添加到ServletContext中
createWebApplicationContext()
1. 调用 determineContextClass() 方法获取WebApplicationContext的Class实例
2. 通过反射创建WebApplicationContext对象,并返回。
determineContextClass()
1. 首先判断 servletContext中是否存在contextClass,如果有则直接返回该Class 实例(默认是没有配置该值的)
2. 从defaultStrategies中通过WebApplicationContext全类名(包名和类名)获取要实现WebApplicationContext接口的类。
defaultStrategies
从当前类的路径下查找 ContextLoader.properties 并加载文件中的键值存储到 defaultStrategies中。
ContextLoader.properties
# Default WebApplicationContext implementation class for ContextLoader.
# Used as fallback when no explicit context implementation has been specified as context-param.
# Not meant to be customized by application developers.
org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
通过WebApplicationContext全类名获取它的实现类是XmlWebApplicationContext。
configureAndRefreshWebApplicationContext()
1. 获取web.xml中配置的applicationContext.xml路径
2. 调用refresh()进行加载xml,解析bean。
总结
通过代码分析ContextLoaderListener的作用就是启动Web容器的时候,初始化WebApplicationContext实例,并存放到ServletContext中。
ContextLoaderListener实现了ServletContextListener接口,在Web容器启动的时会默认执行它的contextInitialized() 方法,然后获取WebApplicationContext的实现类 XmlWebApplicationContext,并实例化后存放到ServletContext中,通过XmlWebApplicationContext类进行加载、解析applicationContext.xml 配置文件。ServletContext在整个Web容器范围内都有效,都可以获取得到。
XmlWebApplicationContext类的作用
通过代码可以大概了解到就是读取web.xml中配置的applicationContext.xml ,然后加载解析Bean信息。
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
相关阅读
Spring的ContextLoaderListener加载上下文的源码分析
前言: 1,如果使用自定义的监听器,需要经过下面的步骤 1到步骤10 2,如果使用Spring自己的监听器ContextLoaderListener,需要经过下面的
spring中packagesToScan的解释 使用早前版本的spring,又恰好采用了Annotation注解方式(而非传统XML方式)配置hibernate对象关系映射,
spring-boot启动失败 Unregistering JMX-exposed bean
寄语: 学习的路途各种文章只是给你提供一个思路,适不适合自己还是要自己去总结,以下是我的项目遇到同样的问题但是尝试了多种方
通过restTemplate保留cookie信息进行集成测试demohttps://www.jianshu.com/p/2f2f897c22f0springboot test集成测试demohttps://b
1:什么是MVC MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业