原文位址: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注解了