Java 强制Spring使用同一配置类中的bean 描述
考虑以下情况:有两个(或更多)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
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不允许您使用相同的名称定义相同类型的两个beanSystem.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() |
|_______________| |________________|