我有两个实现相同接口的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配置”。
能告诉我一个方法吗?
您可以自动装配接口列表,然后选择正确的接口。你可以写:
@Autowired
List<Abc> abcs;
这将导致接口的实现列表。在您的方法体中,您可以选择正确的方法体。
您可以通过几种方式自动执行正确的实现。
将您的自动装配字段名称更改为实现类的相同名称(在camelcase中)
@Autowired
private Abc someClass;
这将尝试使用类名“SomeClass”找到接口'Abc'的实现。
另一种方法是将bean名称添加到服务注释中
@Service("someClass")
public class SomeClass implements abc
然后可以像下面这样自动装配
@Autowired
@Qualifier("someClass")
private Abc SomeClass;
我认为他问的问题是如何配置两个实现并动态使用正确的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();
}
}