程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

AOP:实现一个环绕通知(掌握)

balukai 2025-05-28 15:24:20 文章精选 20 ℃

@Around 环绕通知-增强方法有 ProceedingJoinPoint 参数

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

/**
 * @Around:环绕通知
 *    属性:value 切入点表达式
 *    位置:在方法定义的上面
 *
 * 返回值:Object ,表示调用目标方法希望得到执行结果(不一定是目标方法自己的返回值)
 * 参数:  ProceedingJoinPoint, 相当于反射中 Method。
 *        作用:执行目标方法的,等于Method.invoke()
 *
 *        public interface ProceedingJoinPoint extends JoinPoint {}
 *
 * 特点:
 *  1.在目标方法的前和后都能增强功能
 *  2.控制目标方法是否执行
 *  3.修改目标方法的执行结果。
 */
@Around("execution(* *..SomeServiceImpl.doFirst(..))")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable {

    //获取方法执行时的参数值
    String name = "";
    Object args [] = pjp.getArgs();
    if( args != null && args.length > 0){
        Object arg = args[0];
        if(arg !=null){
            name=(String)arg;
        }
    }

    Object methodReturn = null;

    System.out.println("执行了环绕通知,在目标方法之前,输出日志时间=="+ new Date());
    //执行目标方法  ProceedingJoinPoint,表示doFirst

    if("lisi".equals(name)){
        methodReturn = pjp.proceed();//method.invoke(),表示执行doFirst()方法本身
    }
    
    if( methodReturn != null){
        methodReturn ="环绕通知中,修改目标方法原来的执行结果";
    }

    System.out.println("环绕通知,在目标方法之后,增加了事务提交功能");

    //return "HelloAround,不是目标方法的执行结果";
    //返回目标方法执行结果。没有修改的。
    return methodReturn;

}

Tags:

最近发表
标签列表