繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM