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

问题描述 投票:1回答:3

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

能告诉我一个方法吗?

java spring spring-boot
3个回答
2
投票

您可以自动装配接口列表,然后选择正确的接口。你可以写:

@Autowired
List<Abc> abcs;

这将导致接口的实现列表。在您的方法体中,您可以选择正确的方法体。


2
投票

您可以通过几种方式自动执行正确的实现。

将您的自动装配字段名称更改为实现类的相同名称(在camelcase中)

@Autowired
private Abc someClass;

这将尝试使用类名“SomeClass”找到接口'Abc'的实现。

另一种方法是将bean名称添加到服务注释中

@Service("someClass")
public class SomeClass implements abc

然后可以像下面这样自动装配

@Autowired
@Qualifier("someClass")
private Abc SomeClass;

-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();
 } 
} 
© www.soinside.com 2019 - 2024. All rights reserved.