您的位置:首页 > 编程语言 > Java开发

怎样在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...
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息