Spring框架知識總結-注入Bean的各種異常

近日整合sping和hibernate框架時遇到了一系列的異常,本次主要說明一下spring框架可能出現的異常及解決方案。java

咱們藉助sping強大的bean容器管理機制,經過BeanFactory輕鬆的實現javabean的生命週期管理,然而在配置管理的時候不免會遇到一些異常:spring

異常1:No qualifying bean of type […] found for dependency框架

例如將BeanB自動注入到BeanAide

@Component
public class BeanA {ui

@Autowired
private BeanB dependency;

}this

若是此時BeanB沒有定義在sping的Cntextl裏,那麼在啓動時候就會拋出異常: the no such bean definition exception:hibernate

org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.baeldung.packageB.BeanB] 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)}代理

問題的緣由很簡單 expected at least 1 bean which qualifies as autowire candidate for this dependency.至少須要要有一個定義的bean來依賴注入。固然還可能存在領一種緣由就是,咱們在使用註解,配置註解掃描的時候沒有設置對包掃描的路徑,那麼除了這種狀況以外就應該是沒有定義bean了。對象

異常2:No qualifying bean of type […] is defined繼承

這個異常的意思就是沒有符合的類型Bean.緣由是咱們定義了兩個或者多個相同的bean而不是惟一的bean,例若有一個接口IBeanB,它的兩個實現類Bean1和Bean2

@Component
public class BeanB1 implements IBeanB {
//
}
@Component
public class BeanB2 implements IBeanB {
//
}

此時若是BeanA注入了接口IBeanB,Spring 就不知道使用哪一個實現類來注入

@Component
public class BeanA {

@Autowired
private IBeanB dependency;

}

此時,BeanFactory就會拋出異常NoSuchBeanDefinitionException

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [org.baeldung.packageB.IBeanB] is defined:
expected single matching bean but found 2: beanB1,beanB2

 從異常 expected single matching bean but found 2」.能夠看出未發現惟一的bean。

那麼能夠經過以下方法來解決

@Component
public class BeanA {

@Autowired
@Qualifier(「beanB2」)
private IBeanB dependency;

}

sping 就會明確的知道是使用哪一個Bean做爲注入使用的對象。

異常3:No Bean Named […] is defined

當出現這個異常時,經過名字去Sping上下文查找bean,可能出現異常NoSuchBeanDefinitionException

@Component
public class BeanA implements InitializingBean {

@Autowired
private ApplicationContext context;

@Override
public void afterPropertiesSet() {
context.getBean(「someBeanName」);
}
}

這裏在查找時,不存在名字爲someBeanName的定義,致使異常

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named ‘someBeanName’ is defined

很清晰的指出,不存在此名字的bean定義。

異常4:Proxied Beans

當一個bean在spring上下文中使用JDK動態代理機制,那麼代理類不會繼承目標對象,但它實現了相同的接口,由於這個緣由,若是一個Bean注入了一個接口,那麼不會出現問題,可是若是注入了是一個實現的類,Sping容器就會沒法找到此時的bean,由於代理類沒有繼承目標類。一個bean被代理的緣由很常見的一個場景就是使用spring的事務支持功能,可使用註解@Transactional表示事務,也能夠在配置文件裏設置。

例如若是 ServiceA 注入 ServiceB, 而且同時兩個services 都配置了事務 ,經過類注入那麼將會出現問題。

@Service
@Transactional
public class ServiceA implements IServiceA{

@Autowired
private ServiceB serviceB;

}

@Service
@Transactional
public class ServiceB implements IServiceB{

}

一樣是這兩個Services,若是使用接口注入將正常運行。

@Service
@Transactional
public class ServiceA implements IServiceA{

@Autowired
private IServiceB serviceB;

}

@Service
@Transactional
public class ServiceB implements IServiceB{

}

總結一下:

上面主要講述了幾種sping常見的NoSuchBeanDefinitionException類型異常,而且給出了相應的實踐代碼,在實踐過程當中你們若是遇到問題能夠隨時提問。

獲取最新文章請掃描下面二維碼

相關文章
相關標籤/搜索