在应用启动时,通常想在此时预加载一些资源,全局使用。

Spring会在操作应用上下文时,使用ApplicationEventPublisher触发相关ApplicationContextEvent,我们可以监听这些事件来做一些事情。

Spring中ApplicationContextEvent有以下几种:

其中ContextRefreshedEvent的执行时机为:

 Event raised when an {@code ApplicationContext} gets initialized or refreshed.

我们通常会在Spring加载或刷新应用上下文时,也重新刷新下我们预加载的资源,我们就可以通过监听ContextRefreshedEvent来做这样的事情。

代码如下:

 @Component
public class SpringHandlersProvider implements ApplicationListener<ContextRefreshedEvent> {
Lists<XXX> handlerList = Lists.newHashList();
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//do something
handlerList.add(xxx);
}
}

但对于tomcat工程来说,我们一般会加载两个上下文容器一个父容器,一个mvc子容器

  1. 父容器{@code ContextRefreshedEvent[source=Root WebApplicationContext: startup date [Thu Sep 29 14:52:08 CST 2016]; root of context hierarchy]}
  2. mvc容器{@code ContextRefreshedEvent[source=WebApplicationContext for namespace 'springmvc-servlet': startup date [Thu Sep 29 14:52:34 CST 2016]; parent: Root WebApplicationContext]}

这样就会触发两次ContextRefreshedEvent事件,导致监听此事件所作的逻辑执行两次。

避免方法:

1:只在加载父容器时,执行一次

 @Component
public class SpringHandlersProvider implements ApplicationListener<ContextRefreshedEvent> {
Lists<XXX> handlerList = Lists.newHashList();
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (Predicates.isNull().apply(event.getApplicationContext().getParent())) {
//do something
handlerList.add(xxx);
}
}
}

2:每次执行onApplicationEvent()方法时就将存放资源的容器清空下

 @Component
public class SpringHandlersProvider implements ApplicationListener<ContextRefreshedEvent> {
Lists<XXX> handlerList = Lists.newHashList();
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
handlerList.clear(); //do something
handlerList.add(xxx);
}
}

关于Spring JavaWeb工程中的ContextRefreshedEvent事件的更多相关文章

  1. Spring透过ApplicationListener来触发contextrefreshedevent事件

    Spring通过ApplicationListener接口来触发contextrefreshedevent事件在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据.加载 ...

  2. JavaWeb工程中web.xml基本配置

    一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对. web.xml是不是必须的呢?不是的,只要你不用到里面的配置信息就好了,不过在大型web工程下使用该文 ...

  3. JavaWeb工程中web.xml基本配置(转载学习)

    一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对. web.xml是不是必须的呢?不是的,只要你不用到里面的配置信息就好了,不过在大型web工程下使用该文 ...

  4. JavaWeb工程中url地址的写法

    两种url地址: 1. "/"给服务器使用, 代表web工程根路径(webroot)2. "/"给浏览器使用, 代表tomcat 目录下的webapps文件夹 ...

  5. spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...

  6. Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持   ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...

  7. spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...

  8. SpringCloud核心教程 | 第一篇: 使用Intellij中的Spring Initializr来快速构建Spring Cloud工程

    spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环 ...

  9. SpringCloud核心教程 | 第二篇: 使用Intellij中的maven来快速构建Spring Cloud工程

    spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环 ...

随机推荐

  1. python mooc 3维可视化<第一周第二&三单元>

    小结: 创建 数据对象 structuredGrid grid 使用contourfilter con PolyDataMapper m Actor a 使用 MaskPoint3D mask gly ...

  2. Leetcode860.Lemonade Change柠檬水找零

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  3. 基于spring-boot的测试桩设计--几种常见的controller

    第一种:通过@RequestBody,直接将请求体映射到对象 //@RequestBody @RequestMapping(value = "addUser", method = ...

  4. JavaScript--关于实例对象带不带参数和构造函数带不带参数的关系

    就是一句话: 构造函数创建对象时,也可以带参数,因为可以对对象进行一些属性的初始化,也就是你创建对象时,就带着这些属性,当然你也可以不带参数,后面实例化对象后再进行添加.而且,js函数的参数在定义函数 ...

  5. 下载安装APK(兼容Android7.0)

    我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载. 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和 ...

  6. python os 模块介绍

    """ 重命名文件 os.rename(src,dst) os.rename('123.txt','124.txt') 删除文件 os.remove(path) os.r ...

  7. 帮助你构建云服务的开源平台:openstack

    from:http://os.51cto.com/art/201205/336386_all.htm 概念架构 3-5 OpenStack Compute服务架构 点评:从openstack的能力来看 ...

  8. 1.27eia原油

  9. 每天一个linux命令(1): which命令

    0.学习时间: 2014-05-15 which命令用来在PATH指定的路径中查找特定的文件, 并返回第一个找到的结果. 1. 命令格式:  which 文件名 2.命令功能 一般使用which命令来 ...

  10. 详解composer的自动加载机制

    composer是一个用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码. 安装composer composer ...