1. 程式人生 > >Spring入門知識 ———— 實現AOP返回通知、異常通知、環繞通知

Spring入門知識 ———— 實現AOP返回通知、異常通知、環繞通知

一、引言

以你為AOP只有前置通知和後置通知嗎? 那你就錯啦

在AOP中一共有五種方式:

@Befor:前置通知:在方法執行之前執行

@After:後置通知,在方法之後執行

@AfterReturning:返回通知,在方法返回結果之後執行

@AfterThrowing:異常通知:在方法丟擲異常之後

@Around:環繞通知,圍繞著方法執行

先定義一個橫切點:

 /**
     * 定一個Pointcut,此方法沒有返回值和引數
     * 該方法就是一個標識,不進行呼叫
     *
     * execution中解釋:
     * 第一個* :表示任意修飾符的方法
     * com.spring.two.UserMangeImpl.* : 具體的類下面全部的方法
     * (..):任意引數列表
     */
    @Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))")
    public void beforLog(){}

二、返回通知

  /**
     * 方法正確返回時呼叫
     * returning 使用這個屬性,指定接收的返回值
     * @param result
     */
    @AfterReturning(value = "beforLog()",returning ="result")
    public void insertLogAfterReturning(Object result){
        System.out.println("InsertLogHeadr.insertLogAfter 返回值-->" + result);
    }

三、異常通知


    /**
     * 方法發生異常之後
     * throwing 使用這個屬性,可以指定某一個異常後執行
     */
    @AfterThrowing(value = "beforLog()",throwing = "ex")
    public void insertLogAfterThorwing(Exception ex){
        System.out.println("InsertLogHeadr.insertLogAfterThorwing");
    }

四、環繞通知

返回通知,和異常通知就沒有什麼好說的了。           這個環繞通知,那我就還得說說說下。 環繞通知就相當於動態代理的全過程,看過小編之前講動態代理實現的那個章節,可能有點印象。 註釋上也說了,環繞通知需要攜帶一個引數,並且一定要有返回值

  /**
     * 環繞通知需要攜帶ProceedingJoinPoint型別引數
     * 環繞通知必須有返回值,返回值即為目標方法的返回值
     * @param joinPoint
     * @return
     */
    @Around("beforLog()")
    public Object insertLogAround(ProceedingJoinPoint joinPoint){

        Object result = null;

        try {
            //前置通知
            System.out.println("前置通知.......");

            //呼叫目標的方法
            result = joinPoint.proceed();

            //返回通知
            System.out.println("返回通知.......");
        } catch (Throwable e){
            e.printStackTrace();

            //異常通知
            System.out.println("異常通知.......");
        }

        //後置通知
        System.out.println("後置通知.......");
        return result;
    }