我对别名的使用感到困惑。我确实了解别名是什么以及它是如何使用的,但我看不出它与在 bean 定义中使用名称有何不同。
<bean id="xyx" name="abc,def" .. />
<alias name="xyx" alias="pqr"/>
为什么我可以使用 abc 或 def 时使用别名?
我对别名的使用感到困惑。我确实了解别名是什么以及它是如何使用的,但我看不出它与在 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 的调用时,它都会在您的特定模块中为您注入自定义的BeanService。如果没有这个特性,你应该遍历所有类并手动修改 bean!
别名 bean 总是比非别名 bean 具有更高的优先级,如果有不同的 bean 具有相同的别名,那么最后一个声明的 bean 将具有优先级。换句话说,别名 bean 将覆盖非别名 bean。这在创建大型项目或构建项目扩展并且不想触及原始 bean 定义时特别有用。
Alias 有一个特定的使用场景,多个名称没有:
想象一下您的项目中有多个 config xml 文件,其中大部分是由您的同事编写的,您需要添加自己的 config.xml 文件。使用您将能够引用在另一个配置文件中定义的具有不同名称的 bean,这可能对您的配置更有意义,而无需接触您同事的配置文件。
我最近发现了另一个用例,其中 alias 很容易解决问题。
当自动配置处于活动状态时,Spring Boot 提供serverProperties
可用于访问有关当前运行 Web 应用程序的服务器的信息的 bean。
在集成测试中(即@SpringBootTest
存在注释时),相同的 bean 在 name 下可用org.springframework.boot.autoconfigure.web.ServerProperties
。
当然,可以使用不同的配置文件进行集成测试,但这需要在多个位置手动更改配置。但是,只需添加
<alias name="serverProperties" alias="org.springframework.boot.autoconfigure.web.ServerProperties"/>
相同的配置文件可用于集成测试和生产。
这可能是 Spring Boot 中的一个错误,但是 alias 可以轻松解决问题,而无需等待新版本。而且我当然不可能自己更改引导配置。