AOP是針對面向對象編程的一種補充,有時使用面向對象不能很好完成一些額外的功能業務時,可以采用AOP來進行補充。切面編程的目的就是為了將業務目標進行而外的增強或者擴展。Spring中的AOP是基于JDK動態代理和CGLIB動態代理實現的。
應用場景
日志操作:
可以在業務方法前后進行日志的記錄,不需要每個業務方法中都編寫重復的代碼
權限管理:
可以在調用目標方法前確定是否有權限
事務管理 :
可以在調用業務方法前開啟事務,方法執行完成后提交事務
AOP術語
切面(Aspect):
切面是用于編寫切面邏輯的一個類,這個類很類似于JDK動態代理中的回調處理器或者cglib中的方法攔截器,主要就是將需要增強目標對象的功能代碼編寫在這個類中,而這些功能增強的代碼就是切面邏輯。
通知/增強(Advice):
增強就是對目標行為植入額外的邏輯代碼,從而增強原有的功能。增強分為五種類型:
1)前置通知(在目標方法調用之前執行)
2)后置通知(在目標方法正確返回之后執行)
3)環繞通知(在目標方法調用前后執行)
4)異常通知(當目標方法拋出異常時執行,并且不會執行后置通知)
5)最終通知(不管目標方法有無異常都會執行)
切入點(Pointcut):
切入點類似一個切入的坐標,目的就是要找到目標對象的哪些方法進行切入。切入點可以使用表達式進行描述。
連接點(Joinpoint):
目標對象的方法(被切入的方法)就稱之為連接點,一個切入點可以對應目標對象的的多個連接點。
代理(Proxy):
在運行時動態創建的對象,稱之為代理對象,負責調用目標對象的方法,并執行增強功能。
目標(Target):
被代理的對象就是目標對象。
織入(Weaver):
將切面中的增強邏輯應用到目標具體的連接點上并產生代理的過程稱之為織入。
因此通常描述為“將通知織入到具體的目標”。
織入的時機可以分為以下幾種:
-
類加載時織入,需要特殊的類加載器(LTW)
-
編譯時織入,需要特殊的編譯器(CTW)
-
運行時織入,通常使用JDK或者CGLIB在程序運行創建代理對象,
spring就是基于運行時織入的。(注意:spring僅僅只是用到了AspectJ的切入點表達式和注解,但并沒有使用AspectJ的類加載和編譯時織入功能,而是使用JDK和CGLIB在運行時生成代理對象。)