`
wsjiang
  • 浏览: 392289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(优先初始化Spring IOC容器)

阅读更多

      最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:

 

<listener>
    	<listener-class>
    		org.springframework.web.context.ContextLoaderListener
    	</listener-class>
</listener>
<listener>
	<listener-class>
		com.wsjiang.test.listener.CacheListener
	</listener-class>
</listener>
 

      上面的配置细细大意为,先配置spring监听器,启动spring,再配置一个缓存监听器,我希望他们是顺序执行的,因为在缓存监听器中需要 spring注入其他对象的实例,我期望在服务器加载缓存监听器前加载Spring的监听器,将其优先实例化。但是实际运行发现他们并不是按照配置的顺序加载的。


      对上面的问题我查询了很多资料,找到了一种解决方案,希望能帮助遇到同类问题的朋友。
      思路就是,既然listener的顺序是不固定的,那么我们可以整合两个listener到一个类中,这样就可以让初始化的顺序固定了。我就重写了org.springframework.web.context.ContextLoaderListener这个类的contextInitialized方法.大致代码如下:

public class ContextLoaderListenerOverWrite extends ContextLoaderListener {
	private IStationService stationService;
	private IOSCache osCache;
	@Override
	/**
	 * @description 重写ContextLoaderListener的contextInitialized方法
	 */
	public void contextInitialized(ServletContextEvent event) {
		super.contextInitialized(event);
		ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
		//获取bean
		stationService = (IStationService) applicationContext.getBean("stationService"); 
		osCache = (IOSCache) applicationContext.getBean("osCache");
		/*
		 具体地业务代码
		 */
	}
}
 

      web.xml的配置就由两个listener变为一个:

<listener>
	<listener-class>
                 com.wsjiang.test.listener.ContextLoaderListenerOverWrite
        </listener-class>
</listener>

       这样就能保证Spring的IOC容器先于自定义的缓存监听器初始化,在缓存监听器加载的时候就能使用依赖注入的实例.

       我还是一新手,如果哪位大侠有其他方案,望指点,谢谢!

分享到:
评论
15 楼 wqhuser 2014-11-24  
在加载filter时,static一下
14 楼 wsjiang 2014-07-23  
yeelor 写道
wsjiang 写道
mdsp25xhm 写道
我使用filter可以解决此类问题。

阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了!


filter是过滤器,每次都会执行吧?!

个人觉得还是用listener好

正如帖子所说listener不能保证顺序,需要重写改造!filter通过mapping的方式可以解决贴中提到的顺序问题,但它会拦截所有用户请求!
13 楼 yeelor 2014-07-18  
wsjiang 写道
mdsp25xhm 写道
我使用filter可以解决此类问题。

阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了!


filter是过滤器,每次都会执行吧?!

个人觉得还是用listener好
12 楼 bo_hai 2013-09-12  
学习了。总结的很好!
11 楼 wsjiang 2012-12-08  
mdsp25xhm 写道
我使用filter可以解决此类问题。

阁下好贴,比我当初的方案优雅,这才是楼主想要的回复哟!确实通过filter与其mapping的配置机制是可以完美解决此问题的,学习了!
10 楼 wsjiang 2012-12-08  
channel321 写道
web.xml 的加载顺序是:context-param -> listener -> filter -> servlet
而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。 楼主你说的不是顺序执行应该找找原因比较好哦

web.xml配置文件中listener节点是没有对应mapping配置的,阁下应该是想说通过filter与其mapping机制实现吧!本文中采用的是listener机制的,不过听其他贴友说他们Listener顺序执行是OK的,不知道是否是我当时的自身环境原因导致的!
9 楼 wsjiang 2012-12-08  
GeoConst 写道
我测试的tomcat版本是可以的,你用的是什么版本的tomcat?

这个是去年的时候用到的一个东西,具体当时的Tomcat版本现在也无从查起了,呵呵!
8 楼 channel321 2012-11-22  
web.xml 的加载顺序是:context-param -> listener -> filter -> servlet
而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。 楼主你说的不是顺序执行应该找找原因比较好哦
7 楼 mdsp25xhm 2012-10-23  
我使用filter可以解决此类问题。
6 楼 GeoConst 2012-10-11  
我测试的tomcat版本是可以的,你用的是什么版本的tomcat?
5 楼 GZQ0821 2012-07-30  
楼主,如果我想运行程序时将数据库中的所有表数据查询出来,然后放到缓冲区该怎么做啊??我用的是SSH框架.......
4 楼 wsjiang 2012-07-24  
jpsb 写道
不错,就是耦合度高了。

阁下说的在理,其实这个只是当时的一个快速应急方案!
3 楼 jpsb 2012-07-20  
不错,就是耦合度高了。
2 楼 sence_qi 2012-04-28  
楼主思路甚好
1 楼 LINZHEN2920 2012-01-31  
这个思路很好

相关推荐

    web.xml 中的listener、 filter、servlet 加载顺序及其详解.doc

    web.xml 中的listener、 filter、servlet 加载顺序及其详解

    xorg-x11-libs-6.8.2-1.EL.52.i386.rpm

    在查询metalink时你会发现原因是由于缺少了libXp.so.6包,根据Oracle的解决方案需要安装xorg-x11-deprecated-libs-6.8.2-1.EL.13.20.i386.rpm包。不过REDHAT AS4中包含的相应的包版本比较低。于是从Oracle提供的...

    web.xml详解(web-app_2_3.dtd)

    部署描述文件web.xml详解(web-app_2_3.dtd),全面介绍: 1. icon元素 2. display-name元素 3. description元素 4. distributable元素 5. context-param元素 6. filter元素 7. filter-mapping元素 8. ...

    web.xml配置servlet,filter,listener加载顺序源代码

    本源码将详细介绍web.xml配置中servlet,filter,listener的加载顺序,可以让学习者更好的了解web.xml各种属性配置,自己写的东西,不足之处请大家见谅,顺便收点积分也好下资料,谢谢

    关于web.xml配置文件servlet,filter,listener加载顺序

    关于filter、servlet在web.xml配置及加载顺序

    openstack-barbican-keystone-listener-9.0.0-1.el8.noarch.rpm

    官方离线安装包,亲测可用

    logback-ext-spring

    spring使用logback的扩展,使用起来非常方便。在web.xml中配置: ... &lt;listener-class&gt;ch.qos.logback.ext.spring.web.LogbackConfigListener&lt;/listener-class&gt; &lt;/listener&gt; 即可加载logback配置,使用logback。

    springweb3.0MVC注解(附实例)

    web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示: &lt;?xml...

    JSP Web.xml标准配置内容

    WEB.XML标准配置注解: &lt;!--Servlet的映射,用来说明客户端IE中输入什么样的地址字符串对应到哪个Servlet的别名--&gt; &lt;!--在该例中在IE地址栏中firstservlet字符串对应到别名为firstservlet的servlet--&gt; &lt;servlet-...

    spring和hibernate整合

    在web.Xml中&lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;/WEB-INF/spring/*.bean.xml&lt;/param-value&gt; &lt;/context-param&gt; &lt;listener&gt; &lt;listener-class&gt; org.spring...

    jaxrs-api,javax.ws.rs.Path;

    &lt;listener-class&gt;org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap&lt;/listener-class&gt; &lt;/listener&gt; &lt;servlet-name&gt;Resteasy&lt;/servlet-name&gt; &lt;servlet-class&gt;org.jboss.resteasy.plugins.server...

    一篇关于web.xml配置的详细说明

    一篇关于web.xml配置的详细说明

    spring-boot-reference.pdf

    27.1. The “Spring Web MVC Framework” 27.1.1. Spring MVC Auto-configuration 27.1.2. HttpMessageConverters 27.1.3. Custom JSON Serializers and Deserializers 27.1.4. MessageCodesResolver 27.1.5. Static...

    photoshop-cc-javascript-ref-2019.pdf

    photoshop-cc-javascript-ref-2019学习教程

    ssh框架的搭建

    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;!-- Listener log4jConfigLocation --&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web....

    整合struts2和spring源代码(可以直接在tomcat中运行)

    在web.xml中添加 &lt;listener&gt; &lt;listener-class&gt; org.springframework.web.context.ContextLoaderListener &lt;/listener-class&gt; &lt;/listener&gt; 4.配置spring的配置文件(可以查看WEB-INF里面的...

    基于java的企业级应用开发:Spring的核心容器.ppt

    Web服务器实例化ApplicationContext容器时,通常会使用ContextLoaderListener来实现,此种方式只需要在web.xml中添加如下代码: &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt; ...

    spring-kafka-batch-listener.zip

    spring-kafka顺序消费。 kafka顺序消费。 主要是为博客上传完整代码

    cas 配置client 1.0 &2.0 及proxy DEMO 说明

    2.2.2.1 将cacerts文件复制到TOMCAT的conf目录下修改server.xml connectionTimeout="20000" redirectPort="443" /&gt; enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" ...

    CXF WebService整合Spring示例工程代码demo

    &lt;listener-class&gt;org.springframework.web.util.IntrospectorCleanupListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;servlet-name&gt;CXFService&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache.cxf.transport.servlet....

Global site tag (gtag.js) - Google Analytics