【发布时间】:2013-03-04 21:36:04
【问题描述】:
我对别名的使用感到困惑。我确实了解别名是什么以及它是如何使用的,但我看不出它与在 bean 定义中使用名称有何不同。
<bean id="xyx" name="abc,def" .. />
<alias name="xyx" alias="pqr"/>
当我可以使用 abc 或 def 时为什么要使用别名?
【问题讨论】:
标签: spring
我对别名的使用感到困惑。我确实了解别名是什么以及它是如何使用的,但我看不出它与在 bean 定义中使用名称有何不同。
<bean id="xyx" name="abc,def" .. />
<alias name="xyx" alias="pqr"/>
当我可以使用 abc 或 def 时为什么要使用别名?
【问题讨论】:
标签: spring
在我看来,bean 别名在您无法操作 bean 名称的大型系统中很有帮助。您可以选择为您的系统部分创建自己的名称(别名)...
来自 Spring 文档 (3.0.x) http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/
...有时需要为单个 bean 提供多个名称, 也称为 bean 别名...
因此创建多个名称或/和别名是一回事。
【讨论】:
context1.xml 中有<bean name="id1">,您无法对其进行编辑。然后在context2.xml 中,您使用<import resource="classpath:context1.xml" /> 和在context2.xml 中您想重用bean id1 但在不同的名称下,您需要<alias> 标记,因为您无法编辑bean @987654330 的name 属性@。希望这是有道理的。
一个用例可能是当您想要自定义一些已经在模块化应用程序中某处定义的 bean(例如,每个模块都是一个 spring 项目)时,bean 可能由第三方框架/API 甚至您的团队定义.在这种情况下,您希望仅在您的 spring 项目中调用自定义版本而不更改其他模块(项目),只需在您的 spring 配置中添加别名,这确实是一个强大的功能:
<alias alias="globalBeanService" name="customizedBeanService" />
因此,每当 Spring 找到对 globalBeanService 的调用时,它都会在您的特定模块中为您注入自定义的BeanService。 如果没有这个特性,你应该遍历所有类并手动修改 bean!
【讨论】:
别名 bean 总是比非别名 bean 具有更高的优先级,如果有不同的 bean 具有相同的别名,则最后声明的 bean 将具有优先级。换句话说,别名 bean 将覆盖非别名 bean。 这在创建大型项目或构建项目扩展并且不想触及原始 bean 定义时特别有用。
【讨论】:
别名具有多个名称没有的特定使用场景:
想象一下您的项目中有多个config xml文件,其中大部分是您的同事编写的,您需要添加自己的config.xml文件。使用您将能够引用在另一个配置文件中定义的具有不同名称的 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 中的一个错误,但是 alias 可以轻松解决问题,而无需等待新版本。而且我当然不可能自己更改引导配置。
【讨论】: