2012-10-20 83 views
6

在彈簧使用CGLIB代理的原因:與彈簧CGLIB代理避免問題

一個)構造

B的雙調用)不允許截取來自另一個方法

調用的方法,但爲什麼彈簧產生一個bean然後一個代理?是否有可能動態生成擴展指定bean類的類,然後只調用一次構造函數?這將解決a)和b)公共和受保護的方法。我錯過了什麼?

回答

4

好問題。我認爲這是由於Spring引導應用程序上下文的方式:它首先創建所有原始bean,然後應用後置處理器,例如,增加AOP(包括交易)。這種分層架構需要先創建正常的bean然後包裝它。有人可能會爭辯說,這種方法遵循構成而不是繼承原理。

另請注意,a)應該不成問題。類不應在構造函數中執行初始化,而應在@PostConstruct方法中執行 - 僅調用一次。在另一方面,這導致了另一個問題:

c)一名不能使用構造函數注射CGLIB代理,見SPR-3150

但我明白你的無奈。猜測唯一有效的解決方法是我們完整的AspectJ編織。