如何进行ContextLoaderListener分析

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

创新互联公司是一家专注于网站设计制作、成都网站设计与策划设计,霍林郭勒网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:霍林郭勒等地区。霍林郭勒做网站价格咨询:028-86922220

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



   contextConfigLocation
   
       classpath*:conf/applicationContext.xml
   



   
    org.springframework.web.context.ContextLoaderListener
   


但是很多同学并不清楚它到底有什么作用。
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分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


当前文章:如何进行ContextLoaderListener分析
转载注明:http://azwzsj.com/article/pdiohj.html