6
在彈簧使用CGLIB代理的原因:與彈簧CGLIB代理避免問題
一個)構造
B的雙調用)不允許截取來自另一個方法
調用的方法,但爲什麼彈簧產生一個bean然後一個代理?是否有可能動態生成擴展指定bean類的類,然後只調用一次構造函數?這將解決a)和b)公共和受保護的方法。我錯過了什麼?
在彈簧使用CGLIB代理的原因:與彈簧CGLIB代理避免問題
一個)構造
B的雙調用)不允許截取來自另一個方法
調用的方法,但爲什麼彈簧產生一個bean然後一個代理?是否有可能動態生成擴展指定bean類的類,然後只調用一次構造函數?這將解決a)和b)公共和受保護的方法。我錯過了什麼?
好問題。我認爲這是由於Spring引導應用程序上下文的方式:它首先創建所有原始bean,然後應用後置處理器,例如,增加AOP(包括交易)。這種分層架構需要先創建正常的bean然後包裝它。有人可能會爭辯說,這種方法遵循構成而不是繼承原理。
另請注意,a)應該不成問題。類不應在構造函數中執行初始化,而應在@PostConstruct
方法中執行 - 僅調用一次。在另一方面,這導致了另一個問題:
c)一名不能使用構造函數注射CGLIB代理,見SPR-3150
但我明白你的無奈。猜測唯一有效的解決方法是我們完整的AspectJ編織。