5.SpringAOP基礎

1.AOP概述:Aspect Oriented Programing 面向切面編程
  AOP術語:
      連接點:用方法表示的程序執行點+相對點的方位,(注:spring僅支持方法的連接點,即只能在方法調用前、方法調用後、方法拋出異常以及方法調用前後這些程序執行點織入增強)
      切點(Pointcut):切點只定位到某個方法(方法表示的程序執行點 )上,如想定位到具體連接點上,還需要提供方位信息
      增強(Advice):包含用於添加到目標連接點上的一段執行邏輯+用於定位連接點的方位信息
      目標對象(Target):增強邏輯的織入目標類
      引介:是一種特殊的增強,它爲類添加一些屬性和方法
      織入:將增強添加到目標類具體連接點上的過程。AOP有三種織入的方式:
                1>編譯期織入,這要求使用特殊的Java編譯器
                2>類裝載期織入,這要求使用特殊的類裝載器
                3>動態代理織入,在運行期爲目標類添加增強生成之類的方式
               Spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入
      代理(Proxy):一個類被AOP增強後產出的結果類
      切面(Aspect、Advisor):由切點增強(引介)組成(SpringAOP就是負責實施切面的框架,將切面所定義的橫切邏輯織入到切面所指定的連接點中) 
 (注:AOP的工作重心在於如何將增強應用於目標對象的連接點上,包括兩個工作:第一,如何通過切點和增強定位到連接點上;第二,如何在增強中編寫切面的代碼)

2.基礎知識
  2.1 SpringAOP使用可兩種代理機制:一種是基於JDK的動態代理;另一種是基於CGLib的動態代理。之所以需要兩種代理機制,很大程度上是因爲JDK本身只是提供接口的代理,而不支持類的代理。
  2,2 JDK動態代理:主要涉及到java.lang.reflect包中的兩個類:Proxy和InvocationHandler(書P181)。
        CGLib動態代理:使用JDK創建代理有個限制,即它只能爲接口創建代理實例。CGLib對接口與類都可以創建代理實例。

3.Spring通過Advisor(切面)將Pointcut和Advice兩者組裝起來。有了Advisor的信息,Spring就可以利用JDK或CGLib的動態代理技術採用統一的方式爲目標Bean創建織入切面的代理對象了。
   CGLib所創建的動態代理對象的性能比JDK所創建的代理對象的性能高(大概10倍),但CGLib在創建代理對象時所花費的時間卻比JDK動態代理多(大概8倍)。
   所以,對於singleton的代理對象或者具有實例池的代理,無須頻繁創建代理對象,適合用CGLib動態代理技術,反之適用JDK動態代理技術。同時,CGLib採用動態創建子類的方式生成代理對象,所以不能對目標類中的final方法進行代理。

4.創建增強類(書P187):
   前置增強:BeforeAdvice
   後置增強:AfterReturningAdvice
   環繞增強:MethodInterceptor
   異常拋出增強:ThrowsAdvice
   引介增強:IntroductionInteceptor
   使用增強,代碼直接寫是用ProxyFactory類,或者在spring文件中配置,是利用ProxyFactoryBean類(具體配置屬性見書P191)

5.創建切面
   5.1 前面的增強被織入到目標類的所有方法中,如希望選擇特定的方法,需要切點進行目標連接點的定位。
         Spring中,Pointcut接口描述切點,Pointcut由ClassFilter和MethodMatcher構成,通過ClassFilter定位到某些特定類上,通過MethodMatcher定位到某些特定方法上。
  5.2 切面類型: PointcutAdvisor主要有6個具體實現類:
        DefaultPointcutAdvisor:最常用的切面類型,它可通過任意Pointcut和Advice定義一個切面(唯一不支持的是引介的切面類型,一般通過拓展該類實現自定義切面)
       NameMatchMethodPointcutAdvisor:通過該類可以定義按方法名定義切點的切面
       RegexpMethodPointcutAdvisor:按正則表達式匹配方法名進行切點定義的切面(正則表達式語法見書P207)
       StaticMethodMathodMatcherPointcutAdvisor:靜態方法匹配器切點定義的切面,默認情況下,匹配所以的目標類。(書P203)
       AspectJExpressionPointcutAdvisor:用於AspectJ切點表達式定義切點的切面。
       AspectJPointcutAdvisor:用於AspectJ語法定義切點的切面。

5.3 靜態切面、動態切面、流程切面、符合切點切面、引介切面...

6.自動創建代理
  原理:spring提供自動代理機制,讓容器爲我們自動生成代理。在內部,通過BeanPostProcessor自動完成。
  實現類:
   1>基於Bean配置名規則的自動代理創建器:運行爲一組特定配置名的Bean自動創建代理實例的代理創建器,實現類爲BeanNameAutoProxyCreator;
   2>基於Advisor匹配機制的自動代理創建器:它會對容器中所有的Advisor進行掃描,自動將這些切面應用到匹配的Bean中(即爲目標Bean創建代理實例),實現類爲DefaultAdvisorAutoProxyCreator
   3>基於Bean中AspjectJ註解標籤的自動代理創建器:爲包含Aspect註解的Bean自動創建代理實例,它的實現類是AnnotationAwareAspectJAutoProxyCreator。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章