@Configuration
public class MyRabbitConfig {
@Autowired
RabbitTemplate rabbitTemplate;
@PostConstruct
public void initRabbitTemplate(){
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
}
});
}
}
为什么会报错提示循环依赖呢
答:
问题出在@PostConstruct
注解上。@PostConstruct
注解用于在依赖注入完成后执行方法,但如果在同一个类中使用了该注解,就会导致循环依赖的问题。
循环依赖指的是两个对象之间互相依赖,如果其中一个对象依赖另一个对象,而另一个对象也依赖这个对象,就会形成一个循环依赖的链条。
在这个例子中,MyRabbitConfig
类中使用了@PostConstruct
注解,并在其中调用了initRabbitTemplate()
方法。但是,initRabbitTemplate()
方法中也调用了rabbitTemplate
属性,而rabbitTemplate
属性又依赖于MyRabbitConfig
类。这就导致了循环依赖的问题。
为了解决这个问题,可以将initRabbitTemplate()
方法移动到另一个类中,并在该类中使用@PostConstruct
注解。这样就可以避免循环依赖的问题了。
或者
取消RabbitTemplate @Autowired 及 initRabbitTemplate @PostConstruct ,增加如下代码,自己造一个Bean
@Primary @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); this.rabbitTemplate = rabbitTemplate; rabbitTemplate.setMessageConverter(messageConverter()); initRabbitTemplate(); return rabbitTemplate; }