Spring容器初始化后执行的几种解决方案
项目问题在我们日常Spring开发中,经常会在项目启动的时候做一些列的初始化操作;我们例举几个:项目启动,同时初始化我们系统的一些基础配置(SQL的导入)项目启动,同时启动定时任务按照以上的需求,我们如何来解决?那么我们就需要对Spring容器的初始化需要有一定的了解,今天我们就来讲一讲;解决方案Spring提供了当一个Bean初始化后执行方法的扩展点:InitializingBe...
项目问题
在我们日常Spring开发中,经常会在项目启动的时候做一些列的初始化操作;我们例举几个:
- 项目启动,同时初始化我们系统的一些基础配置(SQL的导入)
- 项目启动,同时启动定时任务
按照以上的需求,我们如何来解决?那么我们就需要对Spring容器的初始化需要有一定的了解,今天我们就来讲一讲;
解决方案
Spring提供了当一个Bean初始化后执行方法的扩展点:InitializingBean。这里的初始化指的就是当该Bean的属性被注入完成后(注意:这里并不是所有属性都需要被设置),所以InitializingBean接口提供的方法名称也很形象:afterPropertiesSet()。
@Component
public class InitServlet implements InitializingBean {
private static final long serialVersionUID = 1L;
@Resource
private XXXService xXXService;
//此处将执行所需初始化的操作;
@Override
public void afterPropertiesSet() throws Exception {
xXXService.someMethod();
}
}
另外还有三种方法也可以实现如上的功能。
1、若采用XML来配置Bean的话,可以指定属性init-method
<bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>
2、通过注解@PostConstruct来修改初始化方法
@Component
public class InitComponent{
@Resource
private XXXService xXXService;
@PostConstruct
public void init() {
xXXService.someMethod();
}
}
值得注意的是,三者可以同时存在,触发的顺序是先触发@PostConstruct修饰的方法,再触发afterPropertiesSet(),最后触发init-method其中@PostConstruct是通过注册一个BeanPostProcessor,在Bean的初始化方法之前调用,而afterPropertiesSet()和init-method都在初始化方法中调用
3、还有一种方法,是当Spring将所有的Bean都初始化完成后,会留给我们一个入口,我们可以实现如下接口
@Component
public class InstantiationTracingBeanPostProcessor implements
ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
System.out.println("-----所有Bean载入完成---");
}
}
更多推荐
所有评论(0)