我对别名的使用感到困惑。我确实理解别名是什么以及它是如何被使用但我不知道它如何与在bean定义上使用名称有什么不同。
<bean id="xyx" name="abc,def" .. />
<alias name="xyx" alias="pqr"/>
当我可以使用abc或def时为什么别名?
在我看来,bean别名在大型系统中很有用,在大型系统中你无法操作bean名称。您可以选择为您的系统部分创建自己的名称(别名)...
来自Spring文档(3.0.x)http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/
...有时候需要给一个bean多个名字,也称为bean别名......
因此创建多个名称或/和别名是一回事。
一个用例可能是你想要定制一些已在模块化应用程序中定义的bean(例如每个模块都是一个spring项目),bean可能由第三方框架/ API甚至你的团队定义。在这种情况下,您希望只在您的spring项目内部调用自定义版本而不更改其他模块(项目),这样做只需在spring配置中添加别名,这确实是一个强大的功能:
<alias alias="globalBeanService" name="customizedBeanService" />
因此,每当spring找到对globalBeanService的调用时,它将在您的特定模块中为您注入customizeBeanService。没有这个功能,你应该仔细检查所有类并手动修改bean!
别名有一个特定的使用场景,多个名称没有:
想象一下您项目中的多个config xml文件,其中大部分是由您的同事创作的,您需要添加自己的config.xml文件。使用您将能够引用另一个配置文件中定义的bean,使用不同的名称,这可能对您的配置更有意义,而无需触摸您的同事的配置文件。
别名的bean总是比非别名的bean具有更高的优先级,并且如果具有相同别名的不同bean,则声明的最后一个bean将具有优先级。换句话说,别名bean将覆盖非别名bean。这在创建大项目或构建项目扩展时非常有用,并且不想触及原始bean定义。
我最近发现了另一个用例,别名很容易解决问题。
当自动配置处于活动状态时,Spring Boot提供bean serverProperties
,可用于访问有关当前运行Web应用程序的服务器的信息。
在集成测试中(即当存在@SpringBootTest
注释时),同名的bean名为org.springframework.boot.autoconfigure.web.ServerProperties
。
当然,可以使用不同的配置文件进行集成测试,但这需要在多个位置手动更改配置。但是,只需添加即可
<alias name="serverProperties" alias="org.springframework.boot.autoconfigure.web.ServerProperties"/>
相同的配置文件可用于集成测试和生产。
这可能是Spring Boot中的一个错误,但别名可以轻松解决问题而无需等待新版本。而且我肯定不会自己改变Boot配置。