Spriingmvc中各种监听器的作用

1、ContextLoaderListener

作用:在启动Web容器时,自动装配Spring applicationContext.xml的配置信息。
因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。
以下是web.xml中ContextLoaderListener的配置和context的配置。

context-param

// 实现了接口 ServletContextListener, 也就是说他必须实现 contextDestroyed, contextInitialized 这两个方法
  1. <span style="font-size:18px;">public class ContextLoaderListener implements ServletContextListener {  
  2.        private ContextLoader contextLoader;  
  3.        /** 
  4.        * Initialize the root web application context. 
  5.        */  
  6. //Spring 框架由此启动 , contextInitialized 也就是监听器类的 main 入口函数  
  7.        public void contextInitialized (ServletContextEvent event) {  
  8.               this.contextLoader = createContextLoader();  
  9.               this.contextLoader.initWebApplicationContext(event.getServletContext());  
  10.        }  
  11.        /** 
  12.        * Create the ContextLoader to use. Can be overridden in subclasses. 
  13.        * @return the new ContextLoader 
  14.        */                                              
  15.        protected ContextLoader createContextLoader() {  
  16.               return new ContextLoader();  
  17.        }  
  18.        /** 
  19.        * Return the ContextLoader used by this listener. 
  20.        * @return the current ContextLoader 
  21.        */  
  22.        public ContextLoader getContextLoader() {  
  23.               return this.contextLoader;  
  24.        }  
  25.        /** 
  26.        * Close the root web application context. 
  27.        */  
  28.        public void contextDestroyed (ServletContextEvent event) {  
  29.               if (this.contextLoader != null) {  
  30.                      this.contextLoader.closeWebApplicationContext(event.getServletContext());  
  31.               }  
  32.        }  
  33. }</span>  
<span style="font-size:18px;">public class ContextLoaderListener implements ServletContextListener {
       private ContextLoader contextLoader;
       /**
       * Initialize the root web application context.
       */
//Spring 框架由此启动 , contextInitialized 也就是监听器类的 main 入口函数
       public void contextInitialized (ServletContextEvent event) {
              this.contextLoader = createContextLoader();
              this.contextLoader.initWebApplicationContext(event.getServletContext());
       }
       /**
       * Create the ContextLoader to use. Can be overridden in subclasses.
       * @return the new ContextLoader
       */                                            
       protected ContextLoader createContextLoader() {
              return new ContextLoader();
       }
       /**
       * Return the ContextLoader used by this listener.
       * @return the current ContextLoader
       */
       public ContextLoader getContextLoader() {
              return this.contextLoader;
       }
       /**
       * Close the root web application context.
       */
       public void contextDestroyed (ServletContextEvent event) {
              if (this.contextLoader != null) {
                     this.contextLoader.closeWebApplicationContext(event.getServletContext());
              }
       }
}</span>
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

2、RequestContextListen
Spring2.0中新增了三个web作用域:request、session、global session,如果希望web容器中的某个bean具有新的作用域,除了在bean中配置相应的scope属性外,
还需要在容器中进行额外的初始化配置。



Request作用域 
< bean id="loginAction" class="com.foo.LoginAction" scope="request"/> 
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。 

Session作用域 
< bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。 

global session作用域 
< bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/> 
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。 

请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误 

为什么需要额外的配置RequestContextFilter 
也许会有一个疑问,已经通过ContextLoaderListener(或ContextLoaderServlet)将Web容器与Spring容器整合,为什么这里还要用额外的RequestContextListener以支持Bean的另外3个作用域,原因是ContextLoaderListener实现ServletContextListener监听器接口,而ServletContextListener只负责监听Web容器的启动和关闭的事件。RequestContextFilter实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,Web服务器接收的每次请求都会通知该监听器。通过配置RequestContextFilter,Spring容器与Web容器结合的更加密切。 

作用域依赖问题 

如果将Web相关作用域的Bean注入到singleton或prototype的Bean中,这种情况下,需要spring AOP 


Java代码  收藏代码

  1. <bean name="car" class="com.demo.Car" scope="request">  
  2.     <aop:scoped-proxy/>  
  3. </bean>  
  4. <bean id="boss" class="com.demo.Boss" >  
  5.     <properrty name="car" ref="car" />  
  6. </bean>  
3、IntrospectorCleanupListener
在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用IntrospectorCleanupListener作为相应的解决办法。
spring中的提供了一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器。它主要负责处理由 JavaBeans Introspector的使用而引起的缓冲泄露。
spring中对它的描述如下:它是一个在web应用关闭的时候,清除JavaBeans Introspector的监听器.web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的类如果你使用了JavaBeans Introspector来分析应用中的类,Introspector 缓冲中会保留这些类的引用.结果在你的应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾回收.不幸的是,清除Introspector的唯一方式是刷新整个缓冲.这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台电脑上的所有应用的introspection都删掉.需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉.应用程序中的类从来不直接使用JavaBeans Introspector.所以他们一般不会导致内部查看资源泄露.但是一些类库和框架往往会产生这个问题.例如:Struts 和Quartz.单个的内部查看泄漏会导致整个的web应用的类加载器不能进行垃圾回收.在web应用关闭之后,你会看到此应用的所有静态类资源(例如单例).这个错误当然不是由这个类自 身引起的.
引入很简单:



  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值