Java 强制Spring使用同一配置类中的bean 描述

Java 强制Spring使用同一配置类中的bean 描述,java,spring,dependency-injection,spring-java-config,Java,Spring,Dependency Injection,Spring Java Config,考虑以下情况:有两个(或更多)Spring配置类,每个类返回一个具有相同名称的bean(例如,baseBean)。另外,假设这些配置类创建了其他bean(例如anotherBean1和anotherBean2),其中包含baseBean实例 有没有办法让Spring注入在同一配置类中创建的baseBean实例 例子 预期产出: Bean1 Bean2 实际产量: Bean2 Bean2 换句话说,Config1.anotherBean1()和Config2.anotherBean2()调用C

考虑以下情况:有两个(或更多)Spring配置类,每个类返回一个具有相同名称的bean(例如,
baseBean
)。另外,假设这些配置类创建了其他bean(例如
anotherBean1
anotherBean2
),其中包含
baseBean
实例

有没有办法让Spring注入在同一配置类中创建的
baseBean
实例

例子 预期产出:

Bean1
Bean2
实际产量:

Bean2
Bean2
换句话说,
Config1.anotherBean1()
Config2.anotherBean2()
调用
Config2.baseBean()
。相反,我希望每个
Config
类调用自己的
baseBean
方法,即
Config1.anotherBean1()
应该使用
Config1.baseBean()
(而
Config2.anotherBean2()
当然应该使用
Config2.baseBean()

是否有一种内置的方式以某种方式强制这种行为,例如通过一些注释?

评论
  • 我所说的“内置”是指,我不想编写
    BeanPostProcessor
    ,或其他类似的扩展。我想添加一个已经存在的注释,或者一些类似的解决方案
  • 添加
    @Primary
    @Qualifier
    等不是一个选项:虽然在上面的示例中可以工作,但具体代码的结构是这样的,这不可能实现。更准确地说,
    baseBean()
    是抽象基类中的一个抽象方法,由同一抽象类中的另一个方法调用。然后,具体类为
    baseBean
    方法提供实现。这意味着,在基类中,我显然不能使用任何限定符来引用
    baseBean
    (也不能使任何实现
    @Primary
  • 所有bean都需要是单例的,即不是原型
  • 我强烈怀疑这是不可能的(我检查了Spring在引擎盖下的工作,似乎它维护了一个“bean name”->bean实例映射,该映射由首先遇到的bean填充。然后,拦截对Java config方法的调用,并返回已缓存的bean),因此确认,我想要的确实是不可能的,这也是一个有效的答案。但我也可能在这方面错了

    • 不同的
      baseBean
      本身需要是Spring管理的bean,这有什么原因吗

      听起来你只打算在
      另一个bean中使用它们

      因此,您只需从
      ConfigX.baseBean()
      中删除
      @Bean
      注释,就可以得到预期的结果。

      我认为这不太可能,因为baseBean的第二个定义将取代applicationContext中的第一个定义。Spring不允许您使用相同的名称定义相同类型的两个bean
      System.out.println(applicationContext.getBeansOfType(BaseBean.class.size())将打印“1”
      
      Bean2
      Bean2
      
      public class BaseConfig {
             @Bean
             public abstract BaseBean baseBean();
      
             @Bean
             public AnotherBean anotherBean() {
                    return new AnotherBean(baseBean());
             }
      }
      
                +----------------------------+
                |   BaseConfig               |
                |                            | 
                | + (abstract) baseBean()    |
                | + anotherBean()            |
                |____________________________|
                          /\
                         /__\
                 _________|__________
         _______|_______      _______|__________
        |    Config1    |     |    Config2     |
        | + baseBean()  |     |  + baseBean()  |
        |_______________|     |________________|