码迷,mamicode.com
首页 > 其他好文 > 详细

ContextLoaderListener

时间:2018-12-19 15:48:22      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:init   inf   tps   添加   指针   initial   inject   div   read   

Spring定义成:分层的J2EE应用框架

1、查看ContextLoaderListener源代码

发现它继承自ContextLoader,并且实现ServletContextListener接口。

ContextLoaderListener 源代码很简单,核心是实现了 ServletContextListener 的contextInitialized和contextDestroyed方法

我们看下类图结构,只列出一部分属性和方法:

 

技术分享图片

因为 contextInitialized和contextDestroyed 方法分别调用了 ContextLoader里面的initWebApplicationContext和closeWebApplicationContext方法

所以核心最终还是 ContextLoader 实现了这个监听器,那这个监听器实现了什么功能呢,我们发现有两个重要属性

contextConfigLocation:即在web.xml里面指定的配置文件所在目录,如果不指定,Spring 会加载WEB_INF目录下,符合 *Context.xml 或 spring*.xml 规则的文件

currentContextPerThread:保存了当前WebApplicationContext

参考:https://blog.csdn.net/gzu_imis/article/details/18989679

参考:https://blog.csdn.net/ysughw/article/details/8992322


其实监听器的加载过程可以描述为:

先判WebApplicationContext是否已存在,不存在的话则初始化一个XmlWebApplicationContext(WebApplicationContext的子类),并把该实例put到 currentContextPerThread 中。而初始化 XmlWebApplicationContext 时,就跟我们使用 new ClassPathXmlApplicationContext(contextConfigLocation)一样

将我们配置的各种bean都添加到XmlWebApplicationContext中,所以我们知道 ApplicationContext 提供各种 getBean的方法。。。

并且可以发现 ContextLoader还提供了获取当前 WebApplicationContext的静态方法:之所以能获取,是因为initWebApplicationContext初始化方法把创建的XmlWebApplicationContext 塞到了 currentContextPerThread 中
注意:说了一堆,跟Spring MVC 不配置ContextLoaderListener有什么关系呢。。。
因为 ContextLoaderListener 本质上是创建了一个 WebApplicationContext ,所以你的项目里面,如果不使用 WebApplicationContext 就可以不配置该节点。

 

 

 

问题:

在Servlet中使用注解的方式引用Spring bean对象,会报空指针,因此可以在init()方法中通过。

原本spring管理的bean和servlet不在一个上下文环境中是无法相互注入的。

解决:

通过使用spring提供的支持可以将当前的servlet上下文环境添加到spring管理的上下文环境中。

 关键在于SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,getServletContext());

@Override
public void init() throws ServletException {  
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,getServletContext()); }

参考:https://blog.csdn.net/cc206476/article/details/78739137

 

ContextLoaderListener

标签:init   inf   tps   添加   指针   initial   inject   div   read   

原文地址:https://www.cnblogs.com/moonsoft/p/10143006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!