@PostConstruct
最近两次接触,一次是项目中,需要封装一个数据库操作到一个方法中;另一次是mq的回调实现类MyCallback,需要在接口中注入自身。还不是很理解这个的逻辑,先知道多少写多少,加上一些百度整合的材料,浅记录一下。
第二次场景如下:
@Compoment
@Slf4j
public class MyCallback implements RabbitTemplate.ConfirmCallback{
@Autowired
private RabbitTemplate rabbitTemplate;
//注入
@PostConstruct //在其他注解执行完之后才执行
public void init(){
rabbitTemplate.setConfirmCallback(this);
}
//代码执行顺序
//1 执行类的实例化
//2 注入
//3 注入
//1.1保存回调消息的id以及相关信息
//1.2 交换机接收到消息 ack=true
//1.3 原因 null
@Override
public void confirm(CorrelationData correlationData,boolean ack,String cause){
String id=correlationData!=null?correlationData.getId():"";
if(ack){
log.info("交换机已经收到{}",id);
}else{
log.info("交换机未收到{},原因{}",id,cause);
}
}
}
对此,重新回顾了@PostContruct的
用在哪里
修饰一个非静态的void()方法,被修饰的方法可以在服务器加载servlet时候运行(什么时候运行servlet?),并只运行一次。
在构造函数之后执行,init()之前执行。
在Bean初始化执行顺序
构造方法-》依赖注入Autowired->@PostContructor 注释的方法。
应用
在静态方法中调用依赖注入的Bean中的方法。
@Component
public class MyUtils {
private static MyUtils staticInstance = new MyUtils();
@Autowired
private MyMethorClassService myService;
@PostConstruct
public void init(){
staticInstance.myService = myService;
}
public static Integer invokeBean(){
return staticInstance.myService.add(10,20);
}
}
关于底层源码暂时不深入。