簡體   English   中英

Spring ApplicationContext.getBean(Class c)不適用於代理類

[英]Spring ApplicationContext.getBean(Class c) not working for proxy classes

我需要通過類類型查找bean。 當bean被代理包裝時(某些方法是@Transactional) - ApplicatoinContext無法找到它們。 我發現如果我通過接口查找它們,它可以工作,但在這種情況下我正在使用具體的類類型。 我知道bean是我正在尋找的類型,但getBean()方法失敗。

我可以調試(並修復)Spring的AbstractBeanFactory代碼中的問題。 問題是它根據我要請求的類型檢查beanInstance的類型,但beanInstance.getClass()是一個代理。 AbstractBeanFactory應該對此進行補償,並將類型與代理的目標類進行比較。

我有一個修復此問題,但我不是特別想使用修補版本的Spring,我懷疑必須有一些我可以配置來使這個工作,或者這真的是一個錯誤?

Spring實現AOP有兩種主要方式(例如@Transactional支持):使用代理接口或CGLIB。

使用接口(默認)如果您的類實現任何接口,Spring將創建一個實現所有接口的代理。 從現在開始,您只能通過該接口使用您的bean。 你的班級深陷其中。

如果您通過啟用代理目標類:

<aop:config proxy-target-class="true">

Spring將創建一個子類(obvoiusly仍然實現所有接口)。 這將解決您的問題。 但請記住,返回的對象實際上不是您的類,而是動態生成的子類,它包裝並委托給您的原始對象。 在大多數情況下,這不應成為問題。

不,當然這不是一個bug,而是眾所周知的行為,不,沒有必要修補Spring。

也可以看看

<context:component-scan base-package="<Your base package name goes here>" />
<aop:aspectj-autoproxy />
<aop:config proxy-target-class="true"/>

在applicationContext.xml中寫下這三行,這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM