项目问题
在我们日常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载入完成---");  
    }  
}  
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐