【问题标题】:Spring bean implementing two interfacesSpring bean 实现两个接口
【发布时间】:2017-08-18 00:08:38
【问题描述】:

我是 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


    【解决方案1】:

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

    Spring 容器只是尝试查找依赖项的实现类,如果找到,它们将被注入到 Autowired 字段中(引用变量名无关紧要,只是它们的类型,即类名很重要) .

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

    public class Context {
    
       @Bean
       public BBB bObject(){
           return new AAA();
       }
    
       @Bean
       public CCC cObject(){   
            return new AAA(); 
       }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      如果存在歧义并且默认情况下 spring 无法解决自动装配时,请使用 Qualified 注释指定 bean 名称。

      【讨论】:

        猜你喜欢
        • 2015-10-09
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多