【问题标题】:Spring bean alias usageSpring bean别名用法
【发布时间】:2012-11-04 17:18:21
【问题描述】:

我知道 bean 别名在 spring 中是什么意思。但我想知道使用别名的用例。为什么有人要使用别名而不是名称来引用 bean?

提前致谢。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我见过的用法如下:给定接口 (SomeBean) 有两个实例:一个用于环境 A,一个用于环境 B。因此,您定义了两个 bean:一个名为“someBeanForA”,另一个名为“someBeanForB”。

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

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

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

    【讨论】:

      【解决方案2】:

      我认为reference documentation 解释得很好:

      在 bean 定义本身中,您可以为 bean,通过使用由 id 指定的最多一个名称的组合 属性,以及 name 属性中的任意数量的其他名称。这些 名称可以是同一个 bean 的等效别名,并且对于 某些情况,例如允许应用程序中的每个组件 通过使用特定于 该组件本身。

      指定实际定义 bean 的所有别名不是 然而,总是足够的。有时需要引入一个 在别处定义的 bean 的别名。这是常见的情况 在配置在每个子系统之间拆分的大型系统中, 每个子系统都有自己的一组对象定义。在基于 XML 的 配置元数据,可以使用元素来完成 这个。

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

      【讨论】:

      • 我看过了,为什么不能用名字本身代替别名呢?
      • 假设您正在实现应用程序的演示模块。您知道它依赖于一个服务,该服务在另一个模块中定义,由其他人实现但尚不可用。因此,您决定为该服务分配一个名称并在您的代码中使用它。实现服务模块时,似乎 authot 没有选择与您选择的名称相同的名称。因此,您可以使用您选择的名称定义一个别名,并指向服务的实际名称。
      • 这听起来很现实,这样可以减少到处更改 bean 名称所需的工作量。
      • @Newbie 确实如此。就像在共享模块中定义入口点一样,如果您有许多作为入口点的 bean,但可以说,每个 openId 提供者都有一个,您可以给它取别名
      • 至少那是在我公司的一个应用程序中实现的
      【解决方案3】:

      springframework docs 本身就有一个例子。

      作为一个具体的例子,考虑组件 A 定义一个 DataSource bean 在其 XML 片段中称为 componentA-dataSource。 然而,组件 B 想将 DataSource 称为 componentB-dataSource 在其 XML 片段中。而主要应用, MyApp,定义自己的 XML 片段并组装最终 来自所有三个片段的应用程序上下文,并希望参考 作为 myApp-dataSource 到 DataSource。

      【讨论】:

      • 同意。还不得不说我从来没有机会使用别名。
      • 我也是。因此正在寻找实时场景。无论如何,谢谢。
      【解决方案4】:

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

      对于一个用例,架构是这样的,即在数据库主表列中提到了 bean id。因此,当调用流时,它会读取表并加载列中提供的具有相同名称的 bean。 bean 定义存在于作为 jar 一部分的 applicationContext 中,我们无法更改它。

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

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

      【讨论】:

        猜你喜欢
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 2022-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多