spring-aop五种通知

@Before()

前置通知:声明该方法为方法执行之前的通知

 //声明该方法是一个前置通知
    @Before("execution(public int com.spring.spring.impl.AitihmeticCalculator.add(int,int))")
    public void beforeMethod(JoinPoint joinPoint){
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        System.out.println(args);
    }

@After()

后置通知:声明该方法为方法执行之后的通知(无论结果发生异常)都执行的通知

                  后置通知还不能访问目标方法的执行结果

 //声明该方法是一个后置通知(无论是否发生异常),执行的通知
    //后置通知中还不能访问目标方法的执行结果
    @After("execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))")
    public void afterMethod(JoinPoint joinPoint){
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        System.out.println("后置通知"+args);
    }
@AfterReturning(value="",returning="")

返回通知:声明该方法是方法正常结束执行之后的代码,返回通知可以拿到返回值

//声明该方法是返回通知,在方法正常结束之后执行的代码
    //返回通知是可以访问到方法的返回值的
    @AfterReturning(value = "execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"->"+result);
    }

异常通知:在方法抛出异常时执行的代码,可以指定异常类型

//在目标方法执行异常时执行的代码
    //可以访问到异常对象,可以指定出现特定异常时出现的通知
    @AfterThrowing(value = "execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))",throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex){
        String name = joinPoint.getSignature().getName();
        System.out.println("这是异常通知"+name+"->"+ex);
    }

环绕通知:环绕通知是最全的,它包括动态代理的全过程,环绕通知必须有返回值,返回值即为目标方法的返回值

//环绕通知需要携带ProceedingJoinPoint 类型的参数
    //环绕通知类似于动态代理的全过程 ProceedingJoinPoint 类型的参数可以决定是否执行目标方法
    //且环绕通知必须有返回值,返回值即为目标方法的返回值
    @Around("execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))")
    public Object aroundMethod(ProceedingJoinPoint pjd){

        String methodname = pjd.getSignature().getName();
        Object result = null;
        try {
            //这里相当于前置通知
            System.out.println("前置通知"+"->"+Arrays.asList(pjd.getArgs()));
            //执行目标方法
            result = pjd.proceed();
            //这里相当于返回通知
            System.out.println("返回通知"+"->"+result);
        } catch (Throwable throwable) {
            //这里相当于异常通知
            System.out.println("异常通知"+"->"+throwable);
            throw  new RuntimeException();
        }finally {
            //这里相当于后置通知
            System.out.println("后置通知"+"->"+methodname+"end");
        }

        return result;
    }

猜你喜欢

转载自blog.csdn.net/xiaosuanmiao123/article/details/82627167
今日推荐