温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行ContextLoaderListener分析

发布时间:2021-12-08 17:50:40 来源:亿速云 阅读:166 作者:柒染 栏目:大数据

如何进行ContextLoaderListener分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

每一个整合spring框架的项目中,总是不可避免地要在web.xml中加入这样一段配置。

<!-- 读取spring配置文件 开始 -->
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
       classpath*:conf/applicationContext.xml
   </param-value>
</context-param>
<listener>
   <listener-class>
    org.springframework.web.context.ContextLoaderListener
   </listener-class>
</listener>
但是很多同学并不清楚它到底有什么作用。
web.xml的配置文件,在启动Web 容器时,自动装配Spring applicationContext.xml 
的配置信息。
我们研究一下ContextLoaderListener源码。
ContextLoaderListener继承自ContextLoader,实现的是ServletContextListener接口。
public class ContextLoaderListener extends ContextLoader implements 
ServletContextListener {
      public ContextLoaderListener() {}
   public ContextLoaderListener(WebApplicationContext context) {        super(context);    }    public void contextInitialized(ServletContextEvent event) {         this.initWebApplicationContext(event.getServletContext());    }    public void contextDestroyed(ServletContextEvent event) {        this.closeWebApplicationContext(event.getServletContext());      ContextCleanupListener.cleanupAttributes(event.getServletContext());   }
 }
ContextLoaderListener可以指定在Web应用程序启动时载入Ioc容器,正是通过
ContextLoader来实现的,ContextLoader来完成实际的WebApplicationContext,
也就是Ioc容器的初始化工作。

ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置ServletContext

的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。简单来说,就是上面这段配置为项目提供了spring支持,初始化了Ioc容器。

在上下文创建时调用的方法是public void contextInitialized(ServletContextEvent event)。它通过传递给它所接收到的servlet上下文(从事件参数获取event.getServletContext())来调用ContextLoader的initWebApplicationContext方法。initWebApplicationContext方法进行的第一个操作是检查是否有另一个根上下文存在。如果至少存在另一个,则抛出IllegalStateException,并且初始化失败。否则,它继续初始化

org.springframework.web.context.WebApplicationContext实例。如果初始化的实例实现了ConfigurableWebApplicationContext接口,则在设置当前应用程序上下文之前,加载器将进行一些设置服务(父上下文,应用程序上下文,servlet上下文等),并通过上下文的refresh()方法来准备bean

ContextLoaderListener中第二个我们需要关注的方法是public void contextDestroyed(ServletContextEvent event)。每当加载程序的上下文关闭时都会调用它。这个方法干了两件事情:

  • 通过ContextLoader中的closeWebApplicationContext(),它关闭应用程序上下文。通过ConfigurableWebApplicationContext close()方法完成上下文关闭。上下文的销毁的过程其实就是销毁bean和关闭bean工厂,此处参考org.springframework.context.support.AbstractApplicationContext中的源码。

  • 调用

    ContextCleanupListener.cleanupAttributes(event.getServletContext()),它将查找当前servlet上下文的所有实现org.springframework.beans.factory.DisposableBean接口的对象。之后,将调用它们的destroy()方法,以销毁不再使用的bean。

ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 

发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 

ServletContext 将要被销毁。

ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context ,被Web 应用内的各个程序共享。因为Context 可以用来保存资源并且共享,所以我所知道ServletContext 

的最大应用是Web 缓存---- 把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O 了。

 在JSP 文件中,application 是 ServletContext 的实例,由JSP 容器默认创建。Servlet 中调用getServletContext() 方法得到 ServletContext 的实例。

我们使用缓存的思路大概是:

       1. 服务器启动时,ServletContextListener 的 contextInitialized() 方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute() 方法将缓存类保存在ServletContext 的实例中。

       2. 程序使用 ServletContext.getAttribute() 读取缓存。如果是 JSP ,使用a pplication.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果缓存发生变化( 如访问计数) ,你可以同时更改缓存和文件/ 数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。

       3. 服务器将要关闭时,ServletContextListener 的 contextDestroyed() 方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

看完上述内容,你们掌握如何进行ContextLoaderListener分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI