我对别名的使用感到困惑。我确实理解别名是什么以及它是如何被使用但我不知道它与在bean定义上使用名称有何不同。
<bean id="xyx" name="abc,def" .. />
<alias name="xyx" alias="pqr"/>
为什么我可以使用abc或def?
的别名答案 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配置。