`
wsjiang
  • 浏览: 394170 次
  • 性别: 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 加载顺序及其详解 在 Web 应用程序中,web.xml 文件扮演着非常重要的角色,它定义了 Web 应用的结构和配置。其中,listener、filter、servlet 是三个非常重要的概念,它们...

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    Spring Web模块和Spring Web MVC模块是Spring框架中的两个关键组成部分,它们在构建Web应用程序时起着至关重要的作用。 Spring Web模块(spring-web-5.2.3.RELEASE.jar)主要负责提供Web相关的功能支持,包括HTTP...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    在`web.xml`中配置Spring时,通常通过Listener来加载Spring容器,这样可以在应用程序启动时初始化所有的Spring Bean。 **示例代码:** ```xml &lt;listener&gt; &lt;listener-class&gt; org.springframework.web.context....

    Tomcat中用web.xml控制Web应用详解

    Tomcat 中 web.xml 文件是 Web 应用的核心配置文件,负责管理 Web 应用的生命周期、Servlet 的加载顺序、Filter 的配置等。下面对 web.xml 文件中的重要元素进行详细解释。 context-param 元素 context-param 元素...

    详解Spring mvc的web.xml配置说明

    当Web应用程序启动时,Tomcat或Jetty等容器会触发此监听器,进而加载Spring的配置信息,创建ApplicationContext,使得Spring框架能够接管应用程序的生命周期管理。 2. **过滤器(Filter)** 过滤器在HTTP请求和...

    加载spring 文件,在web.xml中的配置

    当我们谈论“加载Spring文件,在web.xml中的配置”时,主要是指如何在Web应用启动时初始化Spring IoC(Inversion of Control,控制反转)容器并加载配置文件。 1. **使用ContextLoaderListener** `&lt;listener&gt;`标签...

    apache-tomcat-9.0.44.tar.gz

    Apache Tomcat是一款广泛应用的开源Java Servlet容器,它实现了Java EE Web应用程序规范,特别是Servlet和JavaServer Pages (JSP) 技术。标题中的"apache-tomcat-9.0.44.tar.gz"是一个特定版本的Tomcat源码包,这里...

    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提供的...

    spring-context-support-4.2.2.RELEASE.jar 的jar包

    1. **任务调度支持**: `spring-context-support`包含了对Quartz和Commons JEXL的支持,允许开发者在Spring容器中配置和管理定时任务。例如,你可以通过XML配置或者使用`@Scheduled`注解来定义周期性执行的任务,这...

    web.xml加载顺序与web.xml常用节点解析

    过滤器按照在`web.xml`中定义的顺序初始化,并按顺序拦截请求。`&lt;filter-mapping&gt;`必须出现在其对应的`&lt;filter&gt;`之后,否则会导致解析错误。 - `&lt;servlet&gt;`和`&lt;servlet-mapping&gt;`:定义Servlet及其URL映射,与过滤...

    Tomcat(二) Tomcat实现:Servlet与web.xml介绍 以及 源码分析Tomcat实现细节1

    在web.xml文件中,你可以通过`&lt;listener&gt;`元素定义监听器,当Web应用启动时,Tomcat会实例化这些监听器并调用相应的初始化方法。 ```xml &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context....

    log4j与web.xml的配置

    &lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt; &lt;/listener&gt; ``` - 或者,如果使用的是Servlet 3.0及以上版本,可以使用以下配置: ```xml &lt;listener&gt; &lt;listener-class...

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

    ### web.xml详解(web-app_2_3.dtd) 在Java Web开发中,`web.xml`是部署描述文件的核心部分,它定义了Web应用程序的各种配置信息。本文将详细解析`web-app_2_3.dtd`中定义的主要元素及其作用,帮助开发者更好地...

    web.xml中&lt;/context-param&gt;等配置的作用

    web.xml中&lt;context-param&gt;等配置的作用 了解 web.xml 的配置信息和加载顺序对于理解框架的流程至关重要。在 web.xml 中,&lt;context-param&gt; 配置起着非常重要的作用,它在 web 项目启动时发挥着关键的作用。 首先,...

    tomcat配置文件web.xml与server.xml解析

    在 web.xml 文件中,Servlet 配置用于定义 Servlet 的名称、类名和初始化参数。例如: &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt; ...

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

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

    web.xml各种配置

    容器启动时会加载并读取web.xml文件,因此理解web.xml的配置项对于Web应用开发至关重要。 ### web.xml的内容 web.xml中可以定义多个配置元素,包括但不限于: - **icon**: 指定IDE和GUI工具用来表示Web应用的图像...

    web.xml配置详解, web.xml web.xml 配置实例

    Web.xml 配置详解 Web.xml 是一个部署描述符文件,用于描述 Web 应用程序的配置信息。该文件是基于 XML 语法的,所有的元素都是大小写敏感的。下面是 web.xml 配置文件的详细解释: 定义头和根元素 在 web.xml ...

Global site tag (gtag.js) - Google Analytics