2015-06-22 44 views
0

嗨我試圖定義我自己的rabbitTemplate與春季啓動autoconfig connctionFactory。 首先我想這:使用我自己的兔子模板與自動配置連接工廠春天引導奇怪的行爲

@Configuration 
@EnableRabbit 
public class MyConfiguration { 

@Autowired 
private ConnectionFactory connectionFactory; 

@Bean 
public RabbitTemplate rabbitTemplate(){ 
    RabbitTemplate template = new RabbitTemplate(connectionFactory); 
    return template; 
} 

這是不工作... 所以我已經試過這樣:

@Configuration 
@EnableRabbit 
public class MyConfiguration { 
@Bean 
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
    RabbitTemplate template = new RabbitTemplate(connectionFactory); 
} 

而且它的作品完美有人可以解釋一下嗎?

+0

在後一種情況下,春季是尤爲明顯能夠找出依賴(我懷疑)的順序。後一種情況可能導致模板的急切實例化。但是如果你使用自動配置,我想你可以像Spring Boot那樣去除'@ EnableRabbit'。 –

回答

0

問題是你在你的配置類中注入一個bean引用。該bean引用是由auto-config提供的。我們無法處理該配置類,直到這些字段引用連線。但是,我們應該首先「解析」用戶配置(即在自動配置啓動之前)。

這與Spring Boot無關。你應該避免注入這樣的依賴關係,特別是如果這些只需要一個@Bean聲明。

換句話說,儘可能地嘗試在您的配置中避免週期

+0

感謝您的解釋.B.T.W使用自動裝配的想法來自於RabbitAutoConfiguration類的啓動代碼。 –

+0

內部類首先被處理,這就是爲什麼它是合法的。它是自動配置的一部分,所以沒有像你的情況那樣循環。 –