1. 简介

很多时间当一个Bean被创建出来后,我们希望做一些初始化操作,如初始化数据、缓存预热等。有以下三种方法:

  • 初始化方法initMethod
  • 注解@PostConstruct
  • InitializingBeanafterPropertiesSet方法

2. 三种方法实现

先准备一个类用于测试,代码如下:

  1. public class BeanLifeCheck implements InitializingBean {
  2. private static final Logger logger = LoggerFactory.getLogger(BeanLifeCheck.class);
  3. @Value("${spring.application.name}")
  4. private String applicationName;
  5. public BeanLifeCheck() {
  6. logger.info("BeanLifeCheck: Construct " + applicationName);
  7. }
  8. public void initMethod() {
  9. logger.info("BeanLifeCheck: initMethod " + applicationName);
  10. }
  11. @PostConstruct
  12. public void postConstruct() {
  13. logger.info("BeanLifeCheck: postConstruct " + applicationName);
  14. }
  15. @Override
  16. public void afterPropertiesSet() throws Exception {
  17. logger.info("BeanLifeCheck: afterPropertiesSet " + applicationName);
  18. }
  19. }

2.1 初始化方法initMethod

这个以前是通过xml配置文件来定义的,现在可以直接定义在@Bean注解上,如下:

  1. @Bean(initMethod = "initMethod")
  2. public BeanLifeCheck beanLifeCheck() {
  3. return new BeanLifeCheck();
  4. }

2.2 注解@PostConstruct

直接在方法上加注解即可:

  1. @PostConstruct
  2. public void postConstruct() {
  3. logger.info("BeanLifeCheck: postConstruct " + applicationName);
  4. }

2.3 InitializingBean的afterPropertiesSet方法

需要类实现接口InitializingBean,如下:

  1. @Override
  2. public void afterPropertiesSet() throws Exception {
  3. logger.info("BeanLifeCheck: afterPropertiesSet " + applicationName);
  4. }

3. 总结

运行后的执行日志及顺序如下:

  1. c.r.springweb.day210911.BeanLifeCheck : BeanLifeCheck: 构造方法 null
  2. c.r.springweb.day210911.BeanLifeCheck : BeanLifeCheck: @postConstruct注解 testBeanInit
  3. c.r.springweb.day210911.BeanLifeCheck : BeanLifeCheck: 实现InitializingBean接口afterPropertiesSet testBeanInit
  4. c.r.springweb.day210911.BeanLifeCheck : BeanLifeCheck: initMethod testBeanInit