2013-03-04 67 views
29

我對使用別名感到困惑。我明白別名是什麼以及它是如何使用的,但我不明白它如何與在bean定義中使用名稱不同。春天 - 使用別名vs名字

<bean id="xyx" name="abc,def" .. /> 

<alias name="xyx" alias="pqr"/> 

爲什麼我可以使用abc或def的別名?

回答

21

在我看來,bean的別名可能對大系統很有幫助,在這個大系統中,你不能操縱bean的名字。您可以選擇創建特定的自己的名字(別名)爲您的系統的一部分......

從Spring文檔(3.0.x的) http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/

...有時需要給一個bean多個名稱, 也稱爲豆走樣......因此

創建多個名稱和/或走樣是一樣的。

+3

當你不能更改/修改名稱使用別名,當你可以添加名稱使用名稱 – 2013-03-04 22:47:57

+1

一個例子,我可以想到,如果你想別名的bean是從另一個上下文XML導入,你不能或不可以想要編輯。 – beny23 2013-03-04 22:48:31

+0

@ beny23你能舉個例子嗎?我更容易理解.. thx – yapkm01 2013-03-04 22:51:57

1

別名有使用情景特定多個名字沒有其中:

想象一下在您的項目,其中大部分是由你的同事撰寫了多個配置XML文件,你需要添加自己的config.xml文件。使用你將能夠引用另一個配置文件中定義的bean,其名稱可能對您的配置更有意義,而不必觸摸同事的配置文件。

0

我最近發現了別名可以輕鬆解決問題的另一個用例。

當自動配置處於活動狀態時,Spring Boot提供了可用於訪問有關當前運行Web應用程序的服務器的信息的Bean serverProperties

在集成測試中(即當@SpringBootTest註釋存在時),相同的bean可用名稱org.springframework.boot.autoconfigure.web.ServerProperties提供。

當然,可以使用不同的配置文件進行集成測試,但這需要在多個位置手動更改配置。但是,只需添加

<alias name="serverProperties" alias="org.springframework.boot.autoconfigure.web.ServerProperties"/> 

相同的配置文件可用於集成測試和生產。

這可能是Spring Boot中的一個錯誤,但別名可以輕鬆解決問題而無需等待新版本。當然,我無法改變自己的引導配置。

1

別名bean的優先級總是高於不帶別名的bean,如果bean的別名相同,則聲明的最後一個將具有優先級。換句話說,別名bean將覆蓋未被別名的bean。 這在創建大型項目或構建項目擴展並且不想觸摸原始bean定義時特別有用。

+0

儘管您沒有觸及原始的bean定義,但最終在運行時運行的代碼將來自新的bean定義? – 2017-05-11 15:22:38

1

一個用例可能是當您想要定製某些已經在模塊化應用程序中定義的bean時(例​​如,每個模塊都是一個Spring項目),該bean可能由第三方框架/ API甚至您的團隊定義。在這種情況下,你想,只有裏面的春天項目調用定製版本,而不會改變其他模塊(項目),這樣做只是添加在Spring配置別名這確實是一個強大的功能:

<alias alias="globalBeanService" name="customizedBeanService" /> 

因此,每當spring發現一個對globalBeanService的調用時,它會在您的特定模塊中爲您注入customizedBeanService。 沒有這個功能,你應該通過所有的類並手動修改這個bean!