在两个bean之间注入spring bean-实现相同的接口

时间:2019-04-12 09:42:34

标签: java spring spring-boot

我有两个实现相同接口的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配置”。

您能给我建议一下吗?

3 个答案:

答案 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();
 } 
}