Spring bean别名用法

我知道spring的豆子别名意味着什么。 但我想知道使用别名的用例。 为什么有人想使用别名而不是名称来引用bean?

提前致谢。

我看到的用法如下:你有两个给定接口的实例( SomeBean ):一个用于环境A,一个用于环境B.所以你定义了两个bean:一个名为“someBeanForA”,另一个名为“someBeanForB”。

必须注入此SomeBean的bean不知道必须使用哪一个:它取决于环境。 所以他们使用别名:

 @Autowired @Qualifier("someBeanAlias") private SomeBean someBean; 

部署到环境A时,XML文件中的别名指向someBeanA。 部署到环境B时,XML文件中的别名指向someBeanB。

我认为参考文档很好地解释了它:

在bean定义本身中,您可以为bean提供多个名称,方法是使用id属性指定的最多一个名称和name属性中的任意数量的其他名称。 这些名称可以是同一个bean的等效别名,并且在某些情况下很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的bean名称来引用公共依赖项。

但是,指定实际定义bean的所有别名并不总是足够的。 有时需要为其他地方定义的bean引入别名。 在大型系统中通常就是这种情况,其中配置在每个子系统之间分配,每个子系统具有其自己的一组对象定义。 在基于XML的配置元数据中,您可以使用该元素来完成此任务。

一个具体示例可能是您必须在单点登录模块中为多个应用程序定义身份validation的入口点。 您可以在单个Spring Bean定义中定义它,并在特定应用程序中将其别名,以将其用作身份validation入口点。

springframework文档中有一个例子。

作为一个具体示例,考虑组件A在其XML片段中定义名为componentA-dataSource的DataSource bean的情况。 但是,组件B希望在其XML片段中将DataSource称为componentB-dataSource。 主应用程序MyApp定义了自己的XML片段,并从所有三个片段组装最终的应用程序上下文,并希望将DataSource称为myApp-dataSource。

我们在项目中使用了别名,之所以我们使用它是因为

对于一个用例,该体系结构使得bean id在数据库主表列中被提及。 因此,当调用流时,它会读取表并加载与列中提供的名称相同的bean。 bean定义存在于applicationContext中,它是jar的一部分,我们无法改变它。

现在对于某些实例,我们必须更改表列中的bean名称(以提供更好的命名约定)但由于我们无法更改上下文bean定义,因此我们使用别名将新名称映射到较旧的bean id。

这在多个环境的场景中也有帮助。 如果存在别名,我们不必运行脚本来更新每个环境中的列值。