我有两个实现相同接口的spring bean类。
public interface Abc()
{
String getNumber();
}
这两个类是
@Service
public class SomeClass implements abc
{
@Override
public class getNumber()
{
}
}
@Service
public class SomeClass1 implements abc
{
@Override
public class getNumber()
{
}
}
在我的服务班上。
@Service
public class Demo
{
@Autowired
private Abc abc;
}
}
我遇到一个错误“需要一个bean,但是找到了2个”
对于该错误,我可以将@Primary放在一个bean的顶部。
但是我只能根据运行时(从数据库中)获得的值来说“一个bean配置”。
您能给我建议一下吗?
答案 0 :(得分:2)
您可以自动连接一系列接口,然后选择合适的接口。您可以编写:
@Autowired
List<Abc> abcs;
这将产生接口的实现列表。然后,您可以在方法主体中选择合适的主体。
答案 1 :(得分:2)
自动装配正确的实现方式的几种方式。
将自动连线的字段名称更改为与实现类相同的名称(在驼峰式情况下)
@Autowired
private Abc someClass;
这将尝试找到类名为“ SomeClass”的接口“ Abc”的实现。
另一种方法是在服务注释中添加一个bean名称
@Service("someClass")
public class SomeClass implements abc
然后可以像下面这样自动接线
@Autowired
@Qualifier("someClass")
private Abc SomeClass;
答案 2 :(得分:-1)
我认为他所问的问题是如何配置两个实现,以及如何动态地使用正确的bean(基于DB中的数据)。看来这是工厂模式的一个例子
伪代码
Class SomeFactory{
@Autowired
private Abc someClass;
@Autowired
private Abc someClass1;// keeping bean Name same as class name would solve bean finding issue
public Abc getBeanFor(String type) {
if("someClass".equals(type)
return someClass;
return someClass1;
}
}
Class TestClass{
@Autowired
private SomeFactory factory ;
private void someProcess() {
// Read type from DB for data
factory.getBeanFor(typeReadFromData)
.process();
}
}