如何限制@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。
我在 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。