[英]Autowiring two beans implementing same interface - how to set default bean to autowire?
[英]Injecting spring bean among two beans- implementing same interface
我有两个实现相同接口的 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;
这将导致接口的实现列表。 然后在您的方法体中,您可以选择正确的方法。
您可以通过几种方式自动装配正确的实现。
将您的自动装配字段名称更改为与实现类相同的名称(驼峰式)
@Autowired
private Abc someClass;
这将尝试找到类名为“SomeClass”的接口“Abc”的实现。
另一种方法是将 bean 名称添加到您的服务注释中
@Service("someClass")
public class SomeClass implements abc
然后可以像下面这样自动装配
@Autowired
@Qualifier("someClass")
private Abc SomeClass;
我认为他问的问题是如何配置两个实现以及动态使用正确的 bean(基于数据库中的数据)。 看来这是工厂模式的一个例子
伪代码
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.