2014-01-09 91 views
4

this Spring documentation我知道,當我使用@Bean,默認爲已經等同於:在春天,'autowire = Autowire.NO'做什麼?

@Bean(自動裝配= Autowire.NO)

(默認)不自動裝配。 Bean引用必須通過ref元素定義。建議不要將更改默認設置用於較大的部署,因爲指定的協作者明確提供了更好的控制和清晰度。它在一定程度上記錄了系統的結構。

我只是想了解這對我意味着什麼。如果我的系統是100%Java Config 並且沒有XML配置,那麼從我所知道的情況來看,當我使用@Bean時,'Autowire.no'沒有任何影響。

編輯

通過「不影響」我的意思是這個bean的其他@Autowired引用是自動連接(在其他Java配置類)。我懷疑這是因爲在Java Config中沒有定義明確的'ref元素',所以這個(默認)設置沒有效果。

例子:

首先配置:

package a.b.c; 

@Configuration 
public class AlphaConfig { 

    @Bean(autowire = Autowire.NO) 
    public AlphaBeanType alphaBean() { 
     return new AlphaBeanType(); 
    } 
} 

然後在第二個配置:

package d.e.f; 

import a.b.c.AlphaBeanType; 

@Configuration 
public class AnotherConfig { 

    @Autowire 
    private AlphaBeanType alphaBeanType; 

    @Bean 
    . . . 
} 

我看到的是, 'alphaBeanType' 在第二配置類總是自動裝配 - 這似乎與文檔有衝突 - 因此我的問題。

末編輯

當然,我不能完全從文檔告訴!有人有確切消息麼?

回答

3

設置Autowire.NO並不意味着該豆不能通過@Autowire注入其他豆。 @Autowire默認按類型工作,也可以按名稱使用@Qualifier工作。

所以,如果你的bean有正確的類型或名稱,它會在其他bean中注入,這是正常的。

Autowire.NO意思是這樣的:

不要注入既不按類型或名稱被宣佈與@Bean這 bean的屬性。如果未在@Bean方法代碼中設置bean屬性,請保留它們不填充。

這是如何工作的代碼示例,讓我們定義兩個bean:

public class MyBeanTwo { 

    public MyBeanTwo() { 
     System.out.println(">>> MY Bean 2 created!"); 
    } 
} 

public class MyBean { 

    private MyBeanTwo myBeanTwo; 

    public MyBean() { 
     System.out.println(">>>MyBean created !!"); 
    } 

    public void setMyBeanTwo(MyBeanTwo myBeanTwo) { 
     System.out.println(">>> Injecting MyBeanTwo INTO MyBeanOne !!!"); 
     this.myBeanTwo = myBeanTwo; 
    } 
} 

以及一些配置:

@Configuration 
public class SimpleConfigOne { 

    @Bean 
    public MyBean createMyBean() { 
     return new MyBean(); 
    } 

    @Bean 
    public MyBeanTwo createMyBeanTwo() { 
     return new MyBeanTwo(); 
    } 
} 

有了這個配置,這個應用程序的啓動提供了此日誌:

>>>MyBean created !! 
>>> MY Bean 2 created! 

含義一創建了每個bean的實例,但MyBean沒有注入MyBeanTwo,即使是嚴格的bean也存在正確的類型。

通過聲明MyBean這樣的:

@Bean(autowire = Autowire.BY_TYPE) 
public MyBean createMyBean() { 
    return new MyBean(); 
} 

MyBeanOne現在有資格擁有它是通過類型的自動裝配設置屬性。

啓動日誌變爲:

>>>MyBean created !! 
>>> MY Bean 2 created! 
>>> Injecting MyBeanTwo INTO MyBeanOne !!! 

這表明MyBean已經MyBeanTwo由類型經由通過型注射注入。

之所以Autowire.NO是默認:

通常我們不希望自動裝配與@Bean創建的Bean的屬性。我們通常做的是通過代碼明確地設置屬性,以便於閱讀,作爲文檔的一種形式,並確保屬性設置爲正確的值。

+3

我都投了贊成票並選擇了這個答案(認爲是25分!),但是Eugene給了他獎金,因爲他第一次得到了相同的答案 - 感謝細節! – JoeG

0

這就是春季文檔說的雖然正確嗎?默認是NO。所以,即使你明確指定它,它也不會有任何影響。另外,當你指定一個bean時,你提到的是Autowire.No是正確的。所以它不應該有任何影響。

+0

增加了對該問題的更多說明。重點在於,在給定默認行爲的情況下,默認情況下,其他引用不應該在Java Config中自動掛載(按名稱),當然,實際上它們是。 – JoeG

3

@Bean註解(以及在基於XML的配置的bean元件的autowire屬性)的autowire元件確定bean的自己的屬性的自動裝配狀態,並且沒有相對於豆,其如何被標記與@Bean註釋將注入其他豆。

在另一方面@Autowired標註明確

標誌着一個構造函數,字段setter方法或配置方法,由Spring的依賴注入設施被裝配。

所以你的情況的@Bean註解放在alphaBean方法使用默認Autowire.NO模式宣告禁止性的自動(即隱含的)注射劑(如果有的話)AlphaBeanType豆。雖然@Autowired註釋指示AlphaBeanType bean應該注入到AnotherConfig配置對象中。