关于Spring JavaWeb工程中的ContextRefreshedEvent事件
2024-09-03 02:30:10
在应用启动时,通常想在此时预加载一些资源,全局使用。
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子容器
- 父容器{@code ContextRefreshedEvent[source=Root WebApplicationContext: startup date [Thu Sep 29 14:52:08 CST 2016]; root of context hierarchy]}
- 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);
}
}
最新文章
- centos7的网络设置
- VirtualBox使用总结
- app慢的可能情况需要优化
- web安全学习笔记
- CentOS 7下源码安装MySQL 5.6
- UNIX域套接字(unix domain)
- Wee – 为现代 Web 开发打造的 CSS 脚手架
- web页面的生命周期
- python统计英文首字母出现的次数
- WSAEventSelect
- javaSE(九)之泛型(Generics)
- .net Core学习笔记2 实现列表的条件筛选,排序,分页
- (四) 虚拟摄像头vivi体验
- oneNote2016代码高亮插件
- ssh文件配置
- css段落(后盾)
- code vs 3492 细胞个数
- HotSpot模板解释器目标代码生成过程源码分析
- Object类和包装类的一些方法
- uva10766生成树计数(矩阵树定理)