Spring bean 实现两个接口

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

我是 Springs 的新手,所以请不要介意我的问题是否愚蠢

我有一个实现两个接口的类

public class AAA implements BBB, CCC {

}

public interface BBB {
  void method BBB_method();
}


public interface CCC {
  void CCC_method();
}

我在 Context 类中定义 bean 对象如下:

public class Context {

   @Bean
   public BBB myObject(){
       return new AAA();
   }

   @Bean
   public CCC myObject(){    //Issue is here
        return new AAA();    //Duplicate API name not allowed
   }
}

我已经自动装配了 2 个不同类的 bean,如下所示:

@Autowired
private BBB myObject;

@Autowired
private CCC myObject;

在 Context 类中自动装配并定义 bean 的最佳方法应该是什么?在Context.java中定义2个bean对象有意义吗?如何解决这种情况,我希望我的 bean 自动连接到两个不同的接口(并且对象名称相同......在我的例子中是 myObject)?非常感谢您的回复。谢谢你!

java spring spring-mvc
3个回答
0
投票

您错过的一点是,您不需要与引用变量名称相同的方法名称,即,您不需要将方法名称命名为

myObject

Spring 容器只是尝试查找依赖项的实现类,如果找到,它们将被注入到

Autowired
字段(引用变量名称并不重要,只是它们的类型,即类名称很重要)。

在您的

Context
类中,您不能定义具有相同签名的两个方法,因此请将它们更改为如下所示的名称:

public class Context {

   @Bean
   public BBB bObject(){
       return new AAA();
   }

   @Bean
   public CCC cObject(){   
        return new AAA(); 
   }
}

0
投票

Spring 通过名称解析 bean,因为在运行时它无法从 bean 声明中获取方法返回类型。

解决问题的最佳方法 - 只需指定不同的 bean 声明方法名称(例如 bbbObject 和 cccObject)

自动装配时,如果存在歧义并且 spring 无法默认解析它,请使用

Qualified
注释指定 bean 名称。


0
投票

您还可以从 bean 工厂方法返回实际的类。

@Configuration
class MyConfiguration {
   @Bean
   public AAA a(){
       return new AAA();
   }
}

并且可以注入相同的实例,只是向下转换为这些接口中的任何一个

@Service
class MyService {
  private final BBB myObject;

  private final CCC myObject;

// all-args-constructor
}
© www.soinside.com 2019 - 2024. All rights reserved.