Spring基礎使用(三)-------XML定義AOP的使用

yifanwu發表於2021-09-09
1、AOP實現方式

預編譯方式:AspectJ

動態代理方式(JDK動態代理,CGLIB動態代理):Spring AOP,JbossAOP

2、基本概念

切面(Aspect):對程式進行切割的類,描述切割的點和切割前後需要執行的動作。

連線點(Joinpoint):符合切入點條件的某個具體的點。

通知(Advice):對應切面中要執行的某個動作。

切入點(Pointcut):切面要切割程式的位置。

引入(Introduction):

目標物件(Target Object):被切割的物件

3、通知的型別

前置通知(Before advice):在連線點之前執行的通知。前置通知不能阻止連線點的執行,除非丟擲異常。

後置通知(After advice):在連線點之後執行的通知。

返回後通知(After returning advice):在連線點正常完成退出後執行的通知。

異常後通知(After throwing advice):在連線點丟擲異常退出後執行的通知。

環繞通知(Around advice):包圍連線點的通知,可以在連線點前後執行某些操作。

4、常用切入點表示式

執行所有的public方法:

      `execution(public * *(..))`

執行所有以set開始的方法:

      `execution(* set*(..))`

執行HelloSpringService類中的所有方法:

      `execution(* com.learn.service.HelloSpringService.*(..))`

執行service包中的所有方法:

      `execution(* com.learn.service..(..))`

執行service包及子包下的所有方法:

      `execution(* com.learn.service...(..))`
5、程式示例

xml檔案中新增對aop的支援

宣告切面,切面中新增切入點和通知

    <!--前置通知--&gt<!--返回後通知--&gt<!--後置通知--&gt<!--異常後通知--&gt<!--無參環繞通知--&gt<!--帶參環繞通知--&gt

切面類

public class MyAspect {
    public void beforeAdvice()
    {
        System.out.println("beforeAdvice | before advice");
    }

    public void afterReturning()
    {
        System.out.println("afterReturning | after returning advice");
    }
    public void afterAdvice()
    {
        System.out.println("afterAdvice | after advice");
    }
    public void afterThrowing()
    {
        System.out.println("afterThrowing | after throwing advice");
    }
    public void aroundAdvice(ProceedingJoinPoint pdj) throws Throwable
    {
        System.out.println("aroundAdvice | 1 around  advice");
        pdj.proceed();
        System.out.println("aroundAdvice | 2 around  advice");
    }
    public void aroundAdvice2(ProceedingJoinPoint pdj, String word) throws Throwable
    {
        System.out.println("aroundAdvice2 | 1 around  advice");
        pdj.proceed();
        System.out.println("aroundAdvice2 | 2 around  advice");
    }
}
6、Introductions

Introductions為匹配到的Bean型別增加一個父類介面,並在指定的類中增加該介面的實現細節。

xml配置

    

介面

package learn.interfaces;

public interface Singer {
    void sing();
}

實現類

package learn.service;

import learn.interfaces.Singer;

public class SingerImpl implements Singer {
    public void sing() {
        System.out.println("sing a song!!");
    }
}

驗證程式

        Singer helloService = (Singer) context.getBean("helloService");
        helloService.sing();

輸出

sing a song!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2800716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章