Bean生命周期中@PostConstruct注解用法以及解决场景
@PostConstruct这个注解主要用在构造方法执行之后,也就是说在实例创建完成之后执行的方法。有时候我们需要在实例创建完成之后注入另外一个对象或执行某些操作,如把B注入到A中,这时候如果B还未初始化,那么A中注入的B也是null。如果想要B初始化之后才在A中做一些操作,这时候就需要@PostConstruct注解的帮助。
下面是@Construct,@Autowird以及@PostConstruct的执行顺序。
@Construct -> @Autowired -> @PostConstruct
其中@PostConstruct修饰的方法里面的注入的对象都是初始化成功的对象
例子:
Test1对象会注入test2对象,分别在test1的构造方法和@PostConstruct修饰的方法中打印test2
@Service
public class Test1 {
public int a = 1;
@Autowired
private Test2 test2;
public Test1() {
System.out.println("test1构造方法");
System.out.println("test1构造方法中的test2: " + test2);
}
@PostConstruct
public void say() {
System.out.println("test1的PostConstruct体");
System.out.println("test1中PostConstruct体的test2: " + test2);
}
@Override
public String toString() {
return "Test1{" +
"a=" + a +
'}';
}
}
Test2类如下
@Service
public class Test2 {
public int b = 2;
public Test2() {
System.out.println("test2构造方法");
}
@PostConstruct
public void say() {
System.out.println("test2 PostConstruct体");
}
@Override
public String toString() {
return "Test2{" +
"b=" + b +
'}';
}
}
启动项目,查看控制台打印
test1构造方法
test1构造方法中的test2: null
test2构造方法
test2 PostConstruct体
test1的PostConstruct体
test1中PostConstruct体的test2: Test2{b=2}
可以看出在test2类还未初始化的时候,test1构造方法打印test2的值是null,但@PostConstruct修饰的say方法就可以等到test2初始化成功,将其注入,然后打印的功能。
遇到的场景
项目中某个service类需要启动一个rocketmq客户端,但是mq的配置参数需要从配置文件中注入,刚开始把mq的客户端启动放在该service的构造方法中,但是得到的配置参数都是null,所以服务就报错了。最后采用@PostConstruct注解实现mq生成者的创建,这个注解会将所以的配置都注入成功后才会调用mq的启动方法。
网友评论