如何限制@Primary Bean 的上下文?

how can I limit the context of a @Primary Bean?

我在 MyProject1 中名为 MyBean 的 appContext 中定义了一个 bean。

我在其他应用程序中注入了 MyProject1 的所有 bean 定义(包括 MyBean)。

现在我需要覆盖那个 bean 但没有简单的方法,所以在 MyProject2 中我制作

<bean primary="true" class=MyBean />

效果很好,我的问题是....

所有其他使用 MyBean 的人会怎样?现在将使用 primary=true 的新 bean,或者我如何指定哪个应该使用这个新 bean,哪个应该继续使用旧 bean?

以下spring documentation primary bean仅在有一些候选对象要注入时才使用。所有创建的 bean 都在上下文中。

如果你只需要注入主bean,你可以使用:

@Autowired
private MyBean myBean;

所以你所有的旧 bean 都将被替换为主要 bean。

如果您需要处理所有 MyBean 个 bean(例如您需要 Chain Of Responsibilities),您可以注入:

@Autowired
private List<MyBean> myBeans;

并且注入的对象将包含所有 bean 实例(主要和非主要)。像往常一样,可以通过 0 索引从列表中访问主 bean:myBeans.get(0)。所有替代标记(例如按 vendorType... 过滤)来检测您需要的 bean,您应该在代码过滤集合中指定和处理,但如果项目体系结构没有问题,则通常采用的方式您不需要制作 替代标记 过滤集合中的 bean 对象。

如果您的上下文中只需要一个 bean,请不要忘记 singleton

如果您指定了不同的 bean 唯一名称,您可以使用 @Qualifier 注入(有时使用 @Resource from java API javax.annotation.Resource)指定对应的名称作为按名称检测 bean 的参数。


Spring 还提供使用 SpEL. May be they'll provide new functionality to inject beans using SpEL 注入属性的能力(它可以以最佳方式帮助您解决问题)。

使用profiles or @Conditional@Qualifier 用于解决自动装配的冲突,而不是用于停用除一个以外的所有。使用 @Qualifier 时,所有候选 bean 仍然处于活动状态。

使用配置文件,当您想使用 project2 中的 bean 时,只需使用 profile=project2 启动应用程序; link 上面描述了多种方法。

有关使用 @Conditional 的完整示例,请参阅我的回答 here