天天看點

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注解了

繼續閱讀