【发布时间】:2012-11-04 17:18:21
【问题描述】:
我知道 bean 别名在 spring 中是什么意思。但我想知道使用别名的用例。为什么有人要使用别名而不是名称来引用 bean?
提前致谢。
【问题讨论】:
我知道 bean 别名在 spring 中是什么意思。但我想知道使用别名的用例。为什么有人要使用别名而不是名称来引用 bean?
提前致谢。
【问题讨论】:
我见过的用法如下:给定接口 (SomeBean) 有两个实例:一个用于环境 A,一个用于环境 B。因此,您定义了两个 bean:一个名为“someBeanForA”,另一个名为“someBeanForB”。
必须注入此 SomeBean 的 bean 不知道它们必须使用哪一个:这取决于环境。所以他们使用别名:
@Autowired
@Qualifier("someBeanAlias")
private SomeBean someBean;
部署到环境 A 时,XML 文件中的别名指向 someBeanA。部署到环境 B 时,XML 文件中的别名指向 someBeanB。
【讨论】:
我认为reference documentation 解释得很好:
在 bean 定义本身中,您可以为 bean,通过使用由 id 指定的最多一个名称的组合 属性,以及 name 属性中的任意数量的其他名称。这些 名称可以是同一个 bean 的等效别名,并且对于 某些情况,例如允许应用程序中的每个组件 通过使用特定于 该组件本身。
指定实际定义 bean 的所有别名不是 然而,总是足够的。有时需要引入一个 在别处定义的 bean 的别名。这是常见的情况 在配置在每个子系统之间拆分的大型系统中, 每个子系统都有自己的一组对象定义。在基于 XML 的 配置元数据,可以使用元素来完成 这个。
一个具体的示例可能是您必须在单一登录模块中为多个应用程序定义身份验证入口点。您在单个 Spring Bean 定义中定义它,并在您的特定应用程序中为其设置别名以将其用作身份验证入口点。
【讨论】:
springframework docs 本身就有一个例子。
作为一个具体的例子,考虑组件 A 定义一个 DataSource bean 在其 XML 片段中称为 componentA-dataSource。 然而,组件 B 想将 DataSource 称为 componentB-dataSource 在其 XML 片段中。而主要应用, MyApp,定义自己的 XML 片段并组装最终 来自所有三个片段的应用程序上下文,并希望参考 作为 myApp-dataSource 到 DataSource。
【讨论】:
我们在项目中使用了别名,之所以使用这个是因为
对于一个用例,架构是这样的,即在数据库主表列中提到了 bean id。因此,当调用流时,它会读取表并加载列中提供的具有相同名称的 bean。 bean 定义存在于作为 jar 一部分的 applicationContext 中,我们无法更改它。
现在对于某些情况,我们必须更改表列中的 bean 名称(以提供更好的命名约定),但由于我们无法更改上下文 bean 定义,我们使用别名将新名称映射到旧 bean id。
这在多环境的情况下也很有帮助。如果存在别名,我们不必运行脚本来更新每个环境中的列值。
【讨论】: