Spring日常笔记记录15--@Around 环绕通知-增强方法有 ProceedingJoinPoint 参数

在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值,Object 类型。
并且方法可以包含一个 ProceedingJoinPoint 类型的参数。
接口 ProceedingJoinPoint 其有一个proceed()方法,用于执行目标方法。
若目标方法有返回值,则该方法的返回值就是目标方法的返回值。
最后,环绕增强方法将其返回值返回。该增强方法实际是拦截了目标方法的执行。
 
1.增加接口的方法

 

 

2.接口方法的实现

 

 

 

3.定义切面

 

package com.example.ba03;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Date;

/**
 * @Aspect:是aspectj框架中的注解。
 *      作用:表示当前类是切面类。
 *      切面类:是用来给业务方法增加功能的类,在这个类中有切面的功能代码
 *      使用位置:在类定义的上面
 */
@Aspect
public class MyAspect {
    /**
     * 环绕通知方法的定义格式
     * 1.public
     * 2.必须有一个返回值,推荐使用Object
     * 3.方法名称自定义
     * 4.方法有参数,固定的参数 ProceedingJoinPoint
     */

    /**
     * @Around 环绕通知
     *      属性:value 切入点表达式
     *      位置:在方法的定义上面
     * 特点:
     *      1.它是功能最强的通知
     *      2.在目标方法的前和后都能增强功能
     *      3.控制目标方法是否被调用执行
     *      4.修改原来的目标方法的执行结果,影响最后的调用结果
     *
     * 环绕通知,等同于jdk动态代理的 InvocationHandler接口
     *
     * 参数:ProceedingJoinPoint 就等同于Method
     *      作用:执行目标的方法
     * 返回值:就是目标方法的执行结果,可以被修改
     *
     * 环绕通知:经常做事务,在目标方法之前开启事务,执行目标方法,在目标方法之后提交事务
     */
    @Around(value = "execution(* *..SomeServiceImpl.doFirst(..))")
    public Object myAround(ProceedingJoinPoint pjd) throws Throwable {
        //实现环绕通知
        Object result = null;
        System.out.println("环绕通知:在目标方法之前,输出时间" +new Date());
        //1.目标方法的调用
        result = pjd.proceed(); //相当于method.invoke(); Object result = doFirst();
        System.out.println("环绕通知:在目标方法之后,提交事务");

        //2.在目标方法的前或者后加入功能
        if(result != null){
            result = "Hello AspectJ AOP";
        }

        //返回值目标方法的执行结果
        return result;
    }
}

 

 

4.编写测试类

 

 运行结果:是修改后的执行结果

 

 

posted @ 2021-07-28 11:35  Brack_Pearl  阅读(967)  评论(0编辑  收藏  举报