天天看点

Aspectj注解实现aop通知

首先要在配置文件中添加aspectj注解扫描代理,

<!-- 自动代理aspect, 使得@Aspect注解其作用 -->

    <aop:aspectj-autoproxy/>

通知分为前置通知,

后置通知

最终通知

异常通知

环绕通知

这里是环绕通知的实例代码

代码如下:

--------------------------代码开始-----------------------------

package com;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

//依然要先加组件注解,因为之前在配置文件中的时候也是要用bean标签配置通知类的

@Component

@Aspect

public class AroundAdvice {

    //环绕通知如果没有返回值只能拦截没有返回值的类型,有返回值的话有返回值和没有返回值的都能拦截,因为环绕通知要偷梁换柱就必须要比被拦截的方法完整。

    @Around("execution(* *.sum(..))")

    public Object doAround(ProceedingJoinPoint jp) {

        Object[] obj = jp.getArgs();

        for (int i = 0; i < obj.length; i++) {

            System.out.println(obj[i]);

        }

        System.out.println("woshi_before");

        Object result = null;

        Integer[] a = { 11, 22 };

        try {

            // proceed()括号里要写确切的数,而不是定义,而且要用数组类型而且符合被拦截的方法的参数类型

            result = jp.proceed(a);

            //new一个实际数组类型形式是new XX[]{X,X,X...},而非数组是new XX(X,X...);

            //result=jp.proceed(new Integer[]{12,13});

            System.out.println("woshi_after-returning");

        } catch (Throwable e) {

            // TODO Auto-generated catch block

            System.out.println("woshi_ereo");

            e.printStackTrace();

        } finally {

            System.out.println("woshi_after");

        }

        return result;

    }

}

--------------------------代码结束------------------------------