Bean初始化操作initMethod、@PostConstruct和InitializingBean

1 简介

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

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

2 三种方法实现

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


public class BeanLifeCheck implements InitializingBean {
    private static final Logger logger = LoggerFactory.getLogger(BeanLifeCheck.class);

    @Value("${pkslow.jwt.secretKey}")
    private String secretKey;

    public BeanLifeCheck() {
        logger.info("BeanLifeCheck: Construct " + secretKey);
    }

    public void initMethod() {
        logger.info("BeanLifeCheck: initMethod " + secretKey);
    }

    @PostConstruct
    public void postConstruct() {
        logger.info("BeanLifeCheck: postConstruct " + secretKey);
    }

    @PreDestroy
    public void preDestroy() {
        logger.info("BeanLifeCheck: preDestroy " + secretKey);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        logger.info("BeanLifeCheck: afterPropertiesSet " + secretKey);
    }
}

2.1 初始化方法initMethod

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

@Bean(initMethod = "initMethod")
public BeanLifeCheck beanLifeCheck() {
  return new BeanLifeCheck();
}

2.2 注解@PostConstruct

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

@PostConstruct
public void postConstruct() {
  logger.info("BeanLifeCheck: postConstruct " + secretKey);
}

2.3 InitializingBean的afterPropertiesSet方法

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

@Override
public void afterPropertiesSet() throws Exception {
  logger.info("BeanLifeCheck: afterPropertiesSet " + secretKey);
}

3 总结

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

2021-02-06 17:44:52.377: BeanLifeCheck: Construct null
2021-02-06 17:44:52.379: BeanLifeCheck: postConstruct my-key
2021-02-06 17:44:52.379: BeanLifeCheck: afterPropertiesSet my-key
2021-02-06 17:44:52.379: BeanLifeCheck: initMethod my-key
2021-02-06 17:45:10.347: BeanLifeCheck: preDestroy my-key

三种方法感觉区别不大,用哪个就看习惯了。

欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新…