首頁  >  文章  >  Java  >  Spring框架知識總結-注入Bean的各類異常

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

高洛峰
高洛峰原創
2016-11-22 15:58:291353瀏覽

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

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

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

例如將BeanB自動注入到BeanA

@Component
public class BeanA {

@Autowired
private BeanB dependency;

}

}時候就會拋出異常: the no such bean definition exception:

org.springframework.beans.factory.NoSuchBeanDefinitionException:

No qualifying bean of type [org.baeldung.packageB. deexpm] foundageB。 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

問題的原因很簡單 bgate 1, 1 f5; 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,Spring 就不知道要用哪個實作類別來注入

@Component
public class BeanA {

@Autowired

private IBeanB dependency;ean…

}

private IBeanB dependency;ean...
}

private

🎎尼Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [org.baeldung.packageB.IBeanB] is defined:
expected single matching b5, foundm atching bean but found 2”.可以看出未發現唯一的bean。

那麼可以用以下方法來解決

@Component

public class BeanA {

@Autowired

@Qualifier(“beanB2”) ananB2”)

}

sping 就會明確的知道是使用哪個Bean作為注入使用的對象。


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

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

@Component
public class BeanA implements InitializingBean {

@Autowired

private ApplicationContext context;

@Autowired

private ApplicationContext context;

@Ooid; ;

}
}

在這裡在查找時,不存在名字為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;

}

同樣是這兩個Services,如果使用介面注入將正常運作。

@Service
@Transactional
public class ServiceA implements IServiceA{

@Autowired
private IServiceB serviceB;

}

}ServiceServiceService


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn