作用
@PostConstruct注解是Java自带的,在包javax.annotation下。用于将一个方法标注为初始化方法,在依赖注入完成后执行初始化操作,每个类最多只能有一个方法被该标签标注,且只会执行一次。
被@PostConstruct标注的方法需要满足以下条件:
- 无参数(interceptors除外)
- 无返回值
- 非静态
- 不得抛出未检查的异常(EJB除外)
执行顺序
构造方法 -> 依赖注入 -> @PostConstruct -> @PreDestroy
代码验证
创建类 MyComponentA 和 MyComponentB,并让MyComponentA 依赖注入MyComponentB。
@Slf4j
@Component
public class MyComponentA {
private MyComponentB myComponentB;
public MyComponentA() {
log.info("执行-> MyComponentA 构造方法");
}
@Autowired
public void setMyComponentA(MyComponentB myComponentB) {
this.myComponentB = myComponentB;
log.info("执行-> MyComponentA 依赖注入 MyComponentB");
}
@PostConstruct
public void init() {
log.info("执行-> MyComponentA PostConstruct 方法");
log.info("检验-> MyComponentA 中的 myComponentB is {}", myComponentB);
}
@PreDestroy
public void preDestroy() {
log.info("执行-> MyComponentA PreDestroy 方法");
}
}
@Slf4j
@Component
public class MyComponentB {
}
结果:
1. 执行-> MyComponentA 构造方法
2. 执行-> MyComponentA 依赖注入 MyComponentB
3. 执行-> MyComponentA PostConstruct 方法
4. 检验-> MyComponentA 中的 myComponentB is ******.MyComponentB@c7428cca
5. 执行-> MyComponentA PreDestroy 方法
使用场景
使用依赖注入后的变量初始化其他变量
@Service
public class MessageService {
@Value("${my.message.pattern}")
private String myMessagePattern;
private MessageFormat myMessageFormat;
@PostConstruct
public void init(){
myMessageFormat= new MessageFormat(myMessagePattern);
}
public String getMyMessage(Object... args) {
return myMessageFormat.format(args);
}
}