Bean初始化
我们很多时候在Bean
初始化之后会去做一些操作,如:数据初始化,缓存预热等初始化操作。Spring
提供了三种方式!
- 实现InitializingBean接口,重写
afterPropertiesSet
方法。 - 使用@PostConstruct
- 指定Bean的 initMethod 方法
执行顺序
@PostConstruct -> InitializingBean(afterPropertiesSet) -> initMethod
代码演示
InitializingBean 和 @PostConstruct:
public class SpringBootExample implements InitializingBean {
private static SimpleDateFormat dt;
public SpringBootExample() {
System.out.println("空参构造调用");
}
@PostConstruct
protected void init() {
System.out.println("PostConstruct start init ");
dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("PostConstruct end init , dt: yyyy-MM-dd hh:mm:ss");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet start init ");
dt = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("afterPropertiesSet end init , dt: yyyy-MM-dd");
}
public void initMethod() {
System.out.println("initMethod start init ");
dt = new SimpleDateFormat("yyyy-MM-dd hh");
System.out.println("initMethod end init , dt: yyyy-MM-dd hh");
}
}
initMethod方法:
@Configuration
public class TestConfig {
@Bean(initMethod = "initMethod")
public SpringBootExample springBootExample(){
return new SpringBootExample();
}
}
结果显示
空参构造调用
PostConstruct start init
PostConstruct end init , dt: yyyy-MM-dd hh:mm:ss
afterPropertiesSet start init
afterPropertiesSet end init , dt: yyyy-MM-dd
initMethod start init
initMethod end init , dt: yyyy-MM-dd hh
从结果可以清晰的看到:
Bean在初始化时先调用空参构造器
进行实例化,后调用 @PostConstruct
方法进行初始化,在调用afterPropertiesSet
最后才是initMethod
.若以上流程有一个报错,则不进行后面的方法调用。