Spring - 使用别名vs名称

时间:2013-03-04 21:36:04

标签: spring

我对别名的使用感到困惑。我确实理解别名是什么以及它是如何被使用但我不知道它与在bean定义上使用名称有何不同。

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

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

为什么我可以使用abc或def?

的别名

5 个答案:

答案 0 :(得分:26)

在我看来,bean别名在大型系统中很有用,在大型系统中你无法操作bean名称。您可以选择为您的系统部分创建自己的名称(别名)...

来自Spring文档(3.0.x)的

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/

  

...有时候需要给一个bean多个名字,   也称为豆子别名...

因此创建多个名称或/和别名是一回事。

答案 1 :(得分:5)

用例可能是您想要自定义某些已在模块化应用程序中定义的bean(例如,每个模块都是一个Spring项目),bean可能由第三方框架/ API甚至您的团队定义。在这种情况下,您希望只在您的spring项目内部调用自定义版本而不更改其他模块(项目),这样做只需在spring配置中添加别名,这确实是一个强大的功能:

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

因此,每当spring找到对globalBeanService的调用时,它将在您的特定模块中为您注入customizeBeanService。 如果没有此功能,您应该遍历所有类并手动修改bean!

答案 2 :(得分:1)

Alias有一个特定的使用场景,多个名称都没有:

想象一下项目中的多个config xml文件,其中大部分是由同事创作的,您需要添加自己的config.xml文件。使用您将能够引用另一个配置文件中定义的bean,使用不同的名称,这可能对您的配置更有意义,而无需触摸您的同事&#39;配置文件。

答案 3 :(得分:1)

别名bean总是比非别名bean具有更高的优先级,并且如果具有相同别名的不同bean,则声明的最后一个bean将具有优先级。换句话说,别名bean将覆盖非别名bean。 这在创建大项目或构建项目扩展时非常有用,并且不想触及原始bean定义。

答案 4 :(得分:0)

我最近发现了另一个用例,别名很容易解决问题。

当自动配置处于活动状态时,Spring Boot提供了bean serverProperties,可用于访问有关当前运行Web应用程序的服务器的信息。

在集成测试中(即当存在@SpringBootTest注释时)名称为org.springframework.boot.autoconfigure.web.ServerProperties的同一个bean可用。

当然可以使用不同的配置文件进行集成测试,但这需要在多个位置手动更改配置。但是,只需添加

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

相同的配置文件可用于集成测试和生产。

这可能是Spring Boot中的一个错误,但是别名可以在不等待新版本的情况下轻松解决问题。而且我当然不可能自己改变Boot配置。