【问题标题】:Injecting spring bean among two beans- implementing same interface在两个bean之间注入spring bean-实现相同的接口
【发布时间】:2019-09-03 01:14:53
【问题描述】:

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

你能不能给我一个建议。

【问题讨论】:

  • 我没有完全理解这个问题,但是有一个@Qualifier 注释用于处理多个spring bean 实现。
  • 这个问题不清楚你想要什么。但是,如果您正在寻找基于外部属性的 bean,那么您可以使用 @ConditionalOnProperty。查看更多关于 Spring Docs 的用例。

标签: java spring spring-boot oop dependency-injection


【解决方案1】:

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

@Autowired
List<Abc> abcs;

这将产生一个接口的实现列表。然后,您可以在您的方法主体中选择正确的方法。

【讨论】:

    【解决方案2】:

    您可以通过多种方式自动装配正确的实现。

    将您的自动装配字段名称更改为与实现类相同的名称(驼峰式)

    @Autowired
    private Abc someClass;
    

    这将尝试查找类名为“SomeClass”的接口“Abc”的实现。

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

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

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

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

    【讨论】:

    • 您确定 sping autowires 接口方式与您在第一个选项中描述的方式相同吗?如果 a 有 SomeClass1 和 SomeClass2 怎么办?
    【解决方案3】:

    我认为他问的问题是如何配置两个实现以及动态使用正确的 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();
     } 
    } 
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 2015-10-09
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多