1. 程式人生 > >Spring之AOP在XML中的配置方法

Spring之AOP在XML中的配置方法

字段 object 代理 [] ger 編程 調用 加載器 bsp

AOP 即 Aspect Oriental Program 面向切面編程

先來一個栗子:

 <aop:config>
        <aop:pointcut id="loggerCutpoint"
            expression=
            "execution(* com.how2java.service.ProductService.*(..)) "/>
             
        <aop:aspect id="logAspect" ref="loggerAspect">
            <
aop:after pointcut-ref="loggerCutpoint" method="log"/> </aop:aspect> </aop:config>

這個配置過程是什麽含義呢?

<aop:pointcut id="loggerCutpoint" expression="execution(* com.how2java.service.ProductService.*(..)) "/>

這一句是聲明切入點,切入點的 id 叫 loggerCutPoint ,用來標記這個切入點,

這個expression表示:滿足expression中的方法調用之後,就會去進行切面操作,類似於觸發了切面:


第一個 * 代表返回任意類型
com.how2java.service.ProductService.* 表示包名以 com.how2java.service.ProductService 開頭的類的任意方法(第二個*表示任意方法,通配符肯定知道吧)
(..) 表示方法的參數是任意數量和類型

簡單說就是,只要com.how2java.service這個包中的ProductService類的任意一個函數被調用,不管你的返回值是什麽,都會觸發開關,我就會去執行切面,也就是輔助功能,但是輔助功能是什麽呢,就是下面兩句:

<aop:aspect id="logAspect" ref="loggerAspect">

  <aop:after pointcut-ref="loggerCutpoint" method="log"/>

</aop:aspect>

這兩句是定義了一個切面,上面說只要觸發開關,就會去執行切面,就是指的這裏的切面,所謂切面,就是一個類中的方法而已,搞的這個高大上。。。

id代表這個切面的名字,ref就是指的方法所在的類,method代表的就是方法的名字,

pointcut-ref="loggerCutpoint" 這個就是表示我這個切面是和上面的切點關聯起來的(一個切點是可以關聯多個切面的,一個切面只能關聯一個方法),只要上面的切點被觸發,我就會到這裏來執行一些輔助功能,搞得和單片機的中斷一樣,

after表示在切入點觸發之後來執行我這個中斷,當然也有before,一共有五個before,after,After-returning ,After-throwing,Around。

在 method 參數後面,還可以加上參數列表。

正文開始

網站的功能分為核心功能和輔助功能,輔助功能叫做切面

AOP的過程分為兩步:1,在業務類中插入切入點,2,將切入點和切面類關聯起來

業務類就是核心類,就是網站的主要功能,切面就是輔助功能,日誌,統計之類的

通過配置,可以實現,在某個方法調用的時候,觸發別的方法執行,就好像在監視目標方法,你被執行,就觸發我執行。

AOP術語

1,通知:

通知定義了切面要完成的工作內容和何時完成工作,就是什麽時候去做輔助功能,功能具體是什麽代碼

五種類型

  1. Before——在方法調用之前調用通知

  2. After——在方法完成之後調用通知,無論方法執行成功與否

  3. After-returning——在方法執行成功之後調用通知

  4. After-throwing——在方法拋出異常後進行通知

  5. Around——通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為

前四個好理解的,最後一個

around 表示切面在被監視的函數運行前後都會執行,

下面是切面要執行的函數 log,log函數有一個形參 joinPoint 這個可以理解為斷點,中間一句代表的就是被監視的程序運行,在被監視的程序運行時,可以替換他的形參,這個是 around 厲害的地方,如果被監視的程序,運行的時候輸入的是一個haha字符串作為實參,但是經過log方法之後,這個參數就被替換為abc了

public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("我在被監視程序之前。。。");
        Object object = joinPoint.proceed(new Object[]{"abc"});
        System.out.println("我在被監視程序之後。。。" );
        return object;
    }

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,織入:

織入是將切面應用到目標對象來創建的代理對象過程。

切面在指定的連接點被織入到目標對象中,在目標對象的生命周期中有多個點可以織入

  1. 編譯期——切面在目標類編譯時期被織入,這種方式需要特殊編譯器。AspectJ的織入編譯器就是以這種方式織入切面。
  2. 類加載期——切面在類加載到
  3. JVM ,這種方式需要特殊的類加載器,他可以在目標類被引入應用之前增強該目標類的字節碼。AspectJ5 的 LTW 就支持這種織入方式
  4. 運行期——切面在應用運行期間的某個時刻被織入。一般情況下,在織入切面時候,AOP 容器會為目標對象動態的創建代理對象。Spring AOP 就是以這種方式織入切面。

Spring之AOP在XML中的配置方法