Spring NoSuchBeanDefinitionException
原文地址:http://www.baeldung.com/spring-nosuchbeandefinitionexception
当使用@Autowired和@Service注解进行依赖注入的时候,可能会出现org.springframework.beans.factory.NoSuchBeanDefinitionException异常,是因为BeanFactory在尝试调用一个Bean的时候找不到定义
以下为例:
@Component
public class BeanA {
@Autowired
private BeanB dependency;
//...
}
原因:
一:类BeanB没有定义/无法被Spring扫描到
异常中会指明:expected at least 1 bean which qualifies as autowire candidate for this dependency
没有定义可能是因为没有将类定义为Bean组件,比如没有加上注解@Component, @Repository, @Service, @Controller等
没有扫描到可能是因为在Spring配置文件中配置的扫描包没有包含Service
二:定义冲突
为一个接口定义了两个实现类,并且都声明为@Service
那么在用接口注入的时候,Spring会无法分辨使用哪个Service注入
此时会抛出NoSuchBeanDefinitionException的子异常NoUniqueBeanDefinitionException,并且指明:expected single matching bean but found 2
解决方法是在@Autowired注解下面加上@Qualifier("BeanB")指明使用的是哪个Service,相应的需要指明Service的名称(@Service("BeanB"),@Service(value="BeanB"))
三:动态代理
当Bean被JDK动态代理机制代理的时候,代理会将其声明为接口,而不扩展为其实现的类
所以当使用具体实现的类进行注入的时候会抛出异常,而应使用接口名称进行注入
通常是因为Bean类被@Transactional注解了
推荐阅读
-
Spring Cloud Gateway网关XSS过滤Filter
-
Spring Cloud动态配置实现原理与源码分析
-
Spring+Junit4进行接口测试实例代码
-
在Spring Boot中使用swagger-bootstrap-ui的方法
-
spring mvc中直接注入的HttpServletRequst安全吗
-
Spring boot工具类静态属性注入及多环境配置详解
-
Spring+Hibernate+Struts(SSH)框架整合实战
-
Spring Cloud Zuul的重试配置详解
-
SpringCloud之服务注册与发现Spring Cloud Eureka实例代码
-
Spring的RestTemplata使用的具体方法