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。