2012-11-04 47 views
13

我知道春豆的別名是什麼意思。但我想知道使用別名的用例。爲什麼有人想用別名代替名稱來引用bean?春豆別名的用法

在此先感謝。

回答

4

我看到的用法如下:給定接口(SomeBean)有兩個實例:一個用於環境A,另一個用於環境B.因此,您定義了兩個bean:一個名爲「someBeanForA」,另一個名爲「someBeanForA」另一個名爲「someBeanForB」。

SomeBean必須注入的bean不知道他們必須使用哪一個:它取決於環境。所以他們使用別名:

@Autowired 
@Qualifier("someBeanAlias") 
private SomeBean someBean; 

當部署到環境A時,XML文件中的別名指向someBeanA。在部署到環境B時,XML文件中的別名指向someBeanB。

+0

我認爲這與使用配置文件時的別名用法有關。 – Newbie

+0

我選擇你的答案根據下面的評論... – Newbie

6

我覺得reference documentation解釋非常好:

在bean定義本身,您可以通過使用由id指定了一個名稱的組合爲 豆提供多個名稱, 屬性以及name屬性中的任意數量的其他名稱。這些 名稱可以等同於同一個bean的別名,並且在某些情況下可用,例如允許應用程序中的每個組件使用 特定於該組件本身的bean名稱來指代公共依賴項。

但是,指定bean實際定義的所有別名不是 總是足夠的。有時候需要爲其他地方定義的bean引入一個 別名。在大型系統中,這種情況通常是 ,其中配置分配給每個子系統,每個子系統都有自己的一組對象定義。在基於XML的 配置元數據中,可以使用元素來完成 這個。

一個特定的示例可能是您必須在單點登錄模塊中爲多個應用程序定義驗證入口點。您可以在單個Spring Bean定義中定義它,並將其別名在您的特定應用程序中,以將其用作身份驗證入口點。

+0

我已閱讀此,但爲什麼不能使用名稱本身,而不是別名? – Newbie

+5

假設您正在實現應用程序的演示模塊。您知道它取決於服務,該服務在另一個模塊中定義,由其他人實現並且尚不可用。所以你決定爲這個服務分配一個名字並在你的代碼中使用它。在實施服務模塊時,似乎authot沒有選擇與您所選的名稱相同的名稱。因此,您可以使用您選擇的名稱定義別名,並指向服務的實際名稱。 –

+0

這聽起來很現實,這減少了在任何地方更改bean名稱所需的努力。 – Newbie

2

springframework docs本身有一個例子。

作爲具體示例,考慮組件A在其XML部分中定義名爲componentA-dataSource的 Data bean的情況。 然而,組件B將在其XML片段中將數據源稱爲 componentB-dataSource。主應用程序MyApp定義了它自己的XML片段,並彙編了所有三個片段的最終的應用程序上下文,並且希望將 作爲myApp-dataSource引用到DataSource。

+0

我認爲這只是一個例如,不是實時用例... – Newbie

+0

同意。也不得不說,我從來沒有機會使用別名。 –

+0

我也是。因此正在尋找實時情況。不管怎樣,謝謝。 – Newbie

2

我們已經在我們的項目中使用別名,所以我們用這個的原因是因爲

對於使用的情況下,該架構是這樣的:豆ID在一個數據庫主表列提及。所以當流被調用時,它讀取表並使用列中提供的相同名稱加載bean。 bean定義存在於一個jar中的applicationContext中,我們不能改變它。

現在對於某些實例,我們必須更改表列中的bean名稱(以提供更好的命名約定),但由於我們不能更改上下文bean定義,我們使用別名將新名稱映射到較舊的bean id 。

這也有助於多環境的情況。如果存在別名,我們不必運行腳本來更新每個環境中的列值。