Spring Boot:自动装配具体类时“找不到类型的合格bean ...”
Posted
技术标签:
【中文标题】Spring Boot:自动装配具体类时“找不到类型的合格bean ...”【英文标题】:Spring Boot: "No qualifying bean of type... found" when autowiring concrete class 【发布时间】:2015-05-07 20:22:53 【问题描述】:我正在使用 Spring Boot 和 Spring Boot JPA 编写组件。我有这样的设置:
界面:
public interface Something
// method definitions
实现:
@Component
public class SomethingImpl implements Something
// implementation
现在,我有一个使用 SpringJUnit4ClassRunner
运行的 JUnit 测试,我想用它来测试我的 SomethingImpl
。
当我这样做时
@Autowired
private Something _something;
它有效,但是
@Autowired
private SomethingImpl _something;
导致测试失败,抛出带有消息No qualifying bean of type [com.example.SomethingImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)
的NoSuchBeanDefinitionException
但在测试用例中,我想显式地注入我的SomethingImpl
,因为它是我要测试的类。我该如何做到这一点?
【问题讨论】:
【参考方案1】:如果你想要一个特殊的 bean,你必须使用 @Qualifier
注释:
@Autowired
@Qualifier("SomethingImpl")
private Something _something;
【讨论】:
谢谢,这正是我需要的。还必须注意@Qualifier
中的字符串必须像@Component("SomethingImpl")
一样设置为@Component
。【参考方案2】:
我发现你可以用 javax.inject
风格的 DI 做同样的事情:
@Named("myConcreteThing")
public class SomethingImpl implements Something ...
你想注入的地方:
@Inject
@Named("myConcreteThing")
private Something _something;
@EnableAutoConfiguration
和 @ComponentScan
正确拾取。
【讨论】:
【参考方案3】:我认为你需要在实现类中添加@Service .. 像
@Service
public class SomethingImpl implements Something
// implementation
【讨论】:
【参考方案4】:我遇到了同样的问题,我可以通过将组件扫描路径添加到 Application 类来解决该问题 如下:
@ComponentScan(basePackages= "xx.xx")
【讨论】:
以上是关于Spring Boot:自动装配具体类时“找不到类型的合格bean ...”的主要内容,如果未能解决你的问题,请参考以下文章
Eureka 系列(03)Spring Cloud 自动装配原理