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

标签 java spring dependency-injection inject

我在 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/

相关文章:

java - 来自单线程执行器的 RejectedExecutionException

Java Stack 保留推送元素的副本而不是对它们的引用

线程中的 spring 安全当前用户

java - Spring REST 存储库继承空值

c# - 在 WebApi 中使用 Unity 解析每个请求的 dbcontext

c# - 策略工厂模式的 autofac 配置(已经解决)

java - Jberet,手动设置batchlet上的写入计数

java - 更改我的程序接受文件的方式将会产生来自 GSON : Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $? 的错误

java - 为 bean 创建 session 范围的代理

java - 如何以编程方式将 Java CDI 托管 bean 注入(inject)(静态)方法中的局部变量