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

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);
}
}

最新文章

  1. centos7的网络设置
  2. VirtualBox使用总结
  3. app慢的可能情况需要优化
  4. web安全学习笔记
  5. CentOS 7下源码安装MySQL 5.6
  6. UNIX域套接字(unix domain)
  7. Wee – 为现代 Web 开发打造的 CSS 脚手架
  8. web页面的生命周期
  9. python统计英文首字母出现的次数
  10. WSAEventSelect
  11. javaSE(九)之泛型(Generics)
  12. .net Core学习笔记2 实现列表的条件筛选,排序,分页
  13. (四) 虚拟摄像头vivi体验
  14. oneNote2016代码高亮插件
  15. ssh文件配置
  16. css段落(后盾)
  17. code vs 3492 细胞个数
  18. HotSpot模板解释器目标代码生成过程源码分析
  19. Object类和包装类的一些方法
  20. uva10766生成树计数(矩阵树定理)

热门文章

  1. PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
  2. python中字母的大小写转换
  3. 成功的背后!(送给所有IT人)
  4. 使用JS如何消除一个数组里重复的元素
  5. idea 项目热部署设置
  6. iOS 微信支付如果遇到跳转只有一个确定请看这里
  7. NLP+2vec︱认识多种多样的2vec向量化模型
  8. 用dreamweaver查找页面位置
  9. C++中String字符串查找
  10. uva 10453 【回文串区间dp】