Autowire Spring bean实现两个接口

时间:2016-10-07 14:41:53

标签: spring dependency-injection autowired

是否可以使用Spring Bean实现2个接口,并且能够使用任一接口自动装配该bean?

我有以下内容:

两个接口

public interface ServiceA {}

public interface ServiceB {}

两个使用构造函数自动装配注入不同服务的控制器

@RestController
public class ControllerA {

    public ControllerA(ServiceA service) {}

}

@RestController
public class ControllerB {

    public ControllerB(ServiceB service) {}

}

一个实现两种服务的类

@Service
public class ServiceImpl implements ServiceA, ServiceB { }

我收到NoSuchBeanDefinitionException

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖[ServiceB]找到[ServiceB]类型的限定bean:期望至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{}

我使用的是Spring Boot 1.4.0版本

3 个答案:

答案 0 :(得分:0)

是的,这是可能的,但是 重要的是,创建ServiceImpl类型的服务bean而不是服务接口之一:

@Bean
ServiceImpl service(){
 return new Serviceimpl();
}

Spring在声明的 bean类型上使用反射来找出它实现的接口而不是bean.getClass()。

希望有所帮助

答案 1 :(得分:0)

您可以使用@Qualifier注释。它可以在注射点与@Autowired或@Inject一起应用,以指定您想要注入的bean。

@Autowired
@Qualifier("iceCream")
public void setDessert(Dessert dessert) {
    this.dessert = dessert;
}

资料来源:Spring in Action第4版,

答案 2 :(得分:0)

让我一个接一个地回答您的问题:

  1. 是的,您可以在任何spring bean中实现多个接口。
  2. 是的,您也可以像构造函数一样自动连接接口。

您的共享代码运行正常,只需检查您的SpringBootConfiguration类,我认为您不是在扫描服务包,或者您的服务类不在SpringBootConfiguration类的子包中。

这就是您要面对的原因:

  

NoSuchBeanDefinitionException