2019-03-10/21:12:31 參考博客:MiroKlose AOP術語 1.通知: 通知定義了切麵要完成的工作內容和何時完成工作,就是什麼時候去做輔助功能,功能具體是什麼代碼 五種類型 Before——在方法調用之前調用通知 After——在方法完成之後調用通知,無論方法執行成功與否 Af ...
2019-03-10/21:12:31
AOP術語
1.通知:
通知定義了切麵要完成的工作內容和何時完成工作,就是什麼時候去做輔助功能,功能具體是什麼代碼
五種類型
-
Before——在方法調用之前調用通知
-
After——在方法完成之後調用通知,無論方法執行成功與否
-
After-returning——在方法執行成功之後調用通知
-
After-throwing——在方法拋出異常後進行通知
-
Around——通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為
前四個好理解的,最後一個around 表示切麵在被監視的函數運行前後都會執行,下麵是切麵要執行的函數 log,log函數有一個形參 joinPoint 這個可以理解為斷點,中間一句代表的就是被監視的程式運行,在被監視的程式運行時,可以替換他的形參,這個是 around 厲害的地方,如果被監視的程式,運行的時候輸入的是一個haha字元串作為實參,但是經過log方法之後,這個參數就被替換為ab了.
1 public Object log(ProceedingJoinPoint joinPoint) throws Throwable { 2 System.out.println("我在被監視程式之前。。。"); 3 Object object = joinPoint.proceed(new Object[]{"ab"}); 4 System.out.println("我在被監視程式之後。。。" ); 5 return object; 6 }
2.連接點:
在執行正常的功能時,能夠插入切麵的點。可以作為切入點的點。備選點。
連接點可以是調用方法時、拋出異常時、甚至修改欄位時,在這些點,就可以去執行切麵。
3.切麵:
定義:切麵是通知和切點的集合,通知和切點共同定義了切麵的全部功能——它是什麼,在何時何處完成其功能。
聲明切麵:
在Spring中,切麵就是一個包含通知和切點的對象,是一個Bean,Bean的欄位和方法就是該切麵的狀態和行為,還要通過配置,來指定切入點和通知實現
在xml中,切麵使用<aop:aspect>標簽指定,ref屬性用來引用切麵支持Bean。這個bean裡面就是用來執行要做的輔助功能的。
4.切點:
定義:如果通知定義了“什麼”和“何時”。那麼切點就定義了“何處”。切點會匹配通知所要織入的一個或者多個連接點。通常使用明確的類或者方法來指定這些切點。
作用:定義通知被應用的位置(在哪些連接點)
切入點的聲明:
切入點在Spring也是一個Bean。
切點的聲明有三種定義方式:
1)在<aop:config>標簽下使用<aop:pointcut>聲明一個切入點Bean,該切入點可以被多個切麵使用,對於需要共用使用的切入點最好使用該方式,該切入點使用id屬性指定Bean名字,在通知定義時使用pointcut-ref屬性通過該id引用切入點,expression屬性指定切入點表達式
<aop:config> <aop:pointcut id="pointcut" expression="execution(* cn.javass..*.*(..))"/> <aop:aspect ref="aspectSupportBean"> <aop:before pointcut-ref="pointcut" method="before"/> </aop:aspect> </aop:config>
2)在<aop:aspect>標簽下使用<aop:pointcut>聲明一個切入點Bean,該切入點可以被多個切麵使用,但一般該切入點只被該切麵使用,當然也可以被其他切麵使用,但最好不要那樣使用,該切入點使用id屬性指定Bean名字,在通知定義時使用pointcut-ref屬性通過該id引用切入點,expression屬性指定切入點表達式:
<aop:config> <aop:aspect ref="aspectSupportBean"> <aop:pointcut id=" pointcut" expression="execution(* cn.javass..*.*(..))"/> <aop:before pointcut-ref="pointcut" method="before"/> </aop:aspect> </aop:config>
3)匿名切入點Bean,可以在聲明通知時通過pointcut屬性指定切入點表達式,該切入點是匿名切入點,只被該通知使用:
<aop:config> <aop:aspect ref="aspectSupportBean"> <aop:after pointcut="execution(* cn.javass..*.*(..))" method="afterFinallyAdvice"/> </aop:aspect> </aop:config>
5.引入:
引入允許我們向現有的類中添加方法或屬性
6.織入:
織入是將切麵應用到目標對象來創建的代理對象過程。
切麵在指定的連接點被織入到目標對象中,在目標對象的生命周期中有多個點可以織入
- 編譯期——切麵在目標類編譯時期被織入,這種方式需要特殊編譯器。AspectJ的織入編譯器就是以這種方式織入切麵。
- 類載入期——切麵在類載入到
- JVM ,這種方式需要特殊的類載入器,他可以在目標類被引入應用之前增強該目標類的位元組碼。AspectJ5 的 LTW 就支持這種織入方式
- 運行期——切麵在應用運行期間的某個時刻被織入。一般情況下,在織入切麵時候,AOP 容器會為目標對象動態的創建代理對象。Spring AOP 就是以這種方式織入切麵。