我是 Springs 的新手,所以请不要介意我的问题是否愚蠢
我有一个实现两个接口的类
public class AAA implements BBB, CCC {
}
public interface BBB {
void method BBB_method();
}
public interface CCC {
void CCC_method();
}
我在 Context 类中定义 bean 对象如下:
public class Context {
@Bean
public BBB myObject(){
return new AAA();
}
@Bean
public CCC myObject(){ //Issue is here
return new AAA(); //Duplicate API name not allowed
}
}
我已经自动装配了 2 个不同类的 bean,如下所示:
@Autowired
private BBB myObject;
@Autowired
private CCC myObject;
在 Context 类中自动装配并定义 bean 的最佳方法应该是什么?在Context.java中定义2个bean对象有意义吗?如何解决这种情况,我希望我的 bean 自动连接到两个不同的接口(并且对象名称相同......在我的例子中是 myObject)?非常感谢您的回复。谢谢你!
您错过的一点是,您不需要与引用变量名称相同的方法名称,即,您不需要将方法名称命名为
myObject
。
Spring 容器只是尝试查找依赖项的实现类,如果找到,它们将被注入到
Autowired
字段(引用变量名称并不重要,只是它们的类型,即类名称很重要)。
在您的
Context
类中,您不能定义具有相同签名的两个方法,因此请将它们更改为如下所示的名称:
public class Context {
@Bean
public BBB bObject(){
return new AAA();
}
@Bean
public CCC cObject(){
return new AAA();
}
}
Spring 通过名称解析 bean,因为在运行时它无法从 bean 声明中获取方法返回类型。
解决问题的最佳方法 - 只需指定不同的 bean 声明方法名称(例如 bbbObject 和 cccObject)
自动装配时,如果存在歧义并且 spring 无法默认解析它,请使用
Qualified
注释指定 bean 名称。
您还可以从 bean 工厂方法返回实际的类。
@Configuration
class MyConfiguration {
@Bean
public AAA a(){
return new AAA();
}
}
并且可以注入相同的实例,只是向下转换为这些接口中的任何一个
@Service
class MyService {
private final BBB myObject;
private final CCC myObject;
// all-args-constructor
}