怎样在spring初始化完成后执行一些操作?
2015-10-28 23:07
495 查看
怎样在spring初始化完成后执行一些操作?例如在spring初始化完成后从数据库获取一些信息,检查连接的状态,启动线程执行一些计划任务。spring是通过监听器来来完成的,基本的代码如下:
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
public void onApplicationEvent(ContextRefreshedEvent event) {
//....
}
} 但是在项目的启动过程中发现,上面的操作执行了2次,虽然2次同样的操作有时对性能影响不是很大,但是看见她加载2次确实让我很不爽,其实spring容器可以有多个ApplicationContext,例如spring MVC就存在一个ApplicationContext,但是根ApplicationContext却只有一个,可以通过下面的方式来处理:
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() == null ) {
//do something....
}
}
}
通过判断此时的ApplicationContext的父亲是否为空来知道是否为根ApplicationContext,为根ApplicationContext才执行操作。其实不用上面的方法还可以通过加上一个静态字段来判断次操作是否执行了,如下:
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
/**
* 是否已经初始化过了,确保只初始化一次
*/
private static volatile boolean initialled = false;
public void onApplicationEvent(ContextRefreshedEvent event) {
//通过判断是否为根applicationContext(没有父级)来防止下面的代码多次执行,
//因为还有可能有其他子applicationContext存在。
synchronized(UserDataSynProcessor.class) {
if(event.getApplicationContext().getParent() != null && initialled) {
return;
}
initialled = true;
}
// do something...
}
}
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
public void onApplicationEvent(ContextRefreshedEvent event) {
//....
}
} 但是在项目的启动过程中发现,上面的操作执行了2次,虽然2次同样的操作有时对性能影响不是很大,但是看见她加载2次确实让我很不爽,其实spring容器可以有多个ApplicationContext,例如spring MVC就存在一个ApplicationContext,但是根ApplicationContext却只有一个,可以通过下面的方式来处理:
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() == null ) {
//do something....
}
}
}
通过判断此时的ApplicationContext的父亲是否为空来知道是否为根ApplicationContext,为根ApplicationContext才执行操作。其实不用上面的方法还可以通过加上一个静态字段来判断次操作是否执行了,如下:
package cn.zq.web.executor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
/**
* 是否已经初始化过了,确保只初始化一次
*/
private static volatile boolean initialled = false;
public void onApplicationEvent(ContextRefreshedEvent event) {
//通过判断是否为根applicationContext(没有父级)来防止下面的代码多次执行,
//因为还有可能有其他子applicationContext存在。
synchronized(UserDataSynProcessor.class) {
if(event.getApplicationContext().getParent() != null && initialled) {
return;
}
initialled = true;
}
// do something...
}
}
相关文章推荐
- spring 监听器
- spring中的监听器的使用(注解和非注解方式)
- List集合拆分
- java springmvc 微信公众平台自动回复乱码问题
- java 通过userAgent获取访问者的操作系统与浏览器
- Java中增强型for循环的样例和解释
- JAVA双列集合HashMap
- Java:集合类的区别详解
- 使用sts构建Maven Spring webmvc项目
- java中常见的几种Runtimeexception
- java大数加法
- java 组合模式 详解
- spring开发工具STS下载
- Spring Security 入门详解(转)
- javax.Swing
- 【NOJ】(java)求最值
- spring学习笔记--quartz和定时任务执行
- 疯狂JAVA讲义--画圆
- java.lang.reflect操作对象属性(域)的值
- 【JAVA核心技术卷一】Inner Class内部类&Proxy代理