我在 MyProject1 的 appContext 中定义了一个名为 MyBean 的 bean。
我在其他应用程序中注入(inject)了 MyProject1 的所有 bean 定义(包括 MyBean)。
现在我需要覆盖该 bean,但没有简单的方法,所以在 MyProject2 中我制作
<bean primary="true" class=MyBean />
效果很好,我的问题是......
所有其他使用 MyBean 的人会发生什么情况?现在将使用带有primary=true的新bean,或者我如何指定哪些应该使用这个新bean,哪些应该继续使用旧bean?
最佳答案
已关注 spring documentation primary
bean 仅当有一些候选 bean 需要注入(inject)时才使用。所有创建的 bean 都在上下文中。
如果您只需要注入(inject)主 bean,您可以使用:
@Autowired
private MyBean myBean;
因此,您所有的旧 bean 都将被主要 bean 取代。
如果您需要处理所有 MyBean
beans(例如您执行Chain Of Responsibilities
),您可以注入(inject):
@Autowired
private List<MyBean> myBeans;
注入(inject)的对象将包含所有bean实例(主要和非主要)。与往常一样,主 bean 可以通过 0
索引从列表中访问:myBeans.get(0)
。所有替代标记(例如按 vendorType
... 进行过滤)来检测您需要的 bean,您应该在代码过滤集合中指定和处理,但如果项目架构没有问题,则以通常的方式不需要在集合中创建替代标记过滤bean对象。
如果您的上下文中只需要一个 bean,请不要忘记singleton
。
如果您指定了不同的 bean 唯一名称,则可以使用 @Qualifier 注入(inject)(有时使用java API javax.annotation.Resource
中的@Resource
)指定相应的名称作为参数来通过名称检测bean。
Spring 提供了使用 SpEL 注入(inject)属性的能力。也许他们会提供新功能来使用SpEL注入(inject)bean另外(它可以以最好的方式帮助您解决问题)。
关于java - 如何限制 @Primary Bean 的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177955/