javascript
Spring-AOP 自动创建代理
- 導讀
- 概述
- 實現類介紹
- BeanNameAutoProxyCreator
- DefaultAdvisorAutoProxyCreator
- AnnotationAwareAspectJAutoProxyCreator
- AOP總結
導讀
Spring-AOP 自動創建代理
Spring-AOP 自動創建代理之BeanNameAutoProxyCreator
Spring-AOP 自動創建代理之DefaultAdvisorAutoProxyCreator
Spring-AOP 自動創建代理之AnnotationAwareAspectJAutoProxyCreator
概述
我們通過前面幾篇博文的案例,我們會發現都是通過ProxyFactoryBean創建織入切面的代理,每個需要被代理的Bean都需要使用一個ProxyFactoryBean進行配置。
幸好Spring提供了自動代理機制,讓容器自動生成代理,把開發人員從繁瑣的配置中解脫出來。在內部,Spring使用BeanPostProcessor自動完成這項工作
實現類介紹
基于BeanPostProcessor的自動代理創建器的實現類,將根據一些規則自動在容器實例化Bean時為匹配的Bean生成代理內容。
這些代理創建器可以分為3類
基于Bean配置名規則的自動代理創建器
允許為一組特定配置名的Bean自動創建代理實例的代理創建器,實現類為BeanNameAutoProxyCreator基于Advisor匹配機制的自動代理創建器
它會對容器中所有的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(為目標Bean創建代理實例),實現類為DefaultAdvisorAutoProxyCreator基于Bean中的AspectJ注解標簽的自動代理創建器
為包含AspectJ注解的Bean自動創建代理實例,實現類為AnnotationAwareAspectJAutoProxyCreator.
自動創建代理器實現類的繼承圖
可以清楚的看到所有的自動代理器類都實現了BeanPostPorcessor,在容器實例化Bean時,BeanPostProcessor將對它進行加工處理,所以自動代理創建器有機會對滿足匹配規則的bean自動創建代理對象
BeanNameAutoProxyCreator
請參考另外一篇博文 Spring-AOP 自動創建代理之BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
請參考另外一篇博文 Spring-AOP 自動創建代理之DefaultAdvisorAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
請參考另外一篇博文 Spring-AOP 自動創建代理之AnnotationAwareAspectJAutoProxyCreator
AOP總結
AOP是OOP的延伸,它為程序開發提供了一個嶄新的思考角度,將可以重復性的橫切邏輯抽取到統一的模塊中,通過OOP的縱向抽象和AOP的橫向抽取,程序才可以真正解決重復性代碼問題。
Spring采用JDK動態代理和CGLib動態代理技術在運行期織入增強,所以不需要裝備特殊的編譯器或類裝載器就可以使用AOP功能。
要使用JDK動態代理,目標類必須實現接口,而CGLib不對目標類作任何限制,它通過動態生成目標類子類的方式提供代理。
在JDK動態代理中通過接口來實現方法攔截,所以必須確保要攔截的目標在接口中有定義,否則將無法攔截
在CGLib動態代理中通過動態生成代理子類來實現方法攔截,所以必須確保要攔截的目標方法可以被子類訪問,也就是目標方法必須定義為非final,且非私有實例方法。
JDK在創建代理對象時的性能高于CGLib,而生成的代理對象的運行性能卻比CGLib低。 如果是singleton的代理,推薦使用CGlib動態代理。
Spring只能在方法級別上織入增強,Spring提供了4種類型的方法增強,分別是前置增強、后置增強、環繞增強、異常拋出增強,此外還有一種特殊的引介增強。 引介增強是類級別的,它為目標類織入新的接口實現。 從廣義上將,增強其實是一種最簡單的切面,它既包括橫切代碼又包括切點信息,只不過它的切點只是簡單的方法相對位置信息。 所以增強一般需要和切點聯合才可以表示一個更具實用性的切面。
在Spring中,普通的切點通過目標類名和方法名描述連接點的信息。 流程切點是比較特殊的切點,它通過方法調用堆棧的運行環境來決定連接點。 有時候需要通過切點的交叉或者合并描述一個最終的切點,可以使用ComposablePointcut的復合切點
切面是增強和切點的聯合體,可以很方便的通過Spring提供的ProxyFactoryBean將切面自入不同的目標類中。 當然為每個目標類手工配置一個切面是比較繁瑣的,Spring利用BeanPostProcessor可干涉Bean生命周期的機制,提供一些可以自動創建代理、自入切面的自動代理創建器,其中DefaultAdvisorAutoProxyCreator是功能強大的自動代理穿件器,它可以將容器中所有的Advisor自動織入目標Bean中。
總結
以上是生活随笔為你收集整理的Spring-AOP 自动创建代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP 引介切面
- 下一篇: Spring-AOP 自动创建代理之Be