【Spring】AOP 面向切面编程-环绕通知(掌握)

纠正:
环绕通知方法必须有返回值是错的,如果目标方法的返回值为空,则环绕通知的返回值就可以为void。还有,方法也不是必须要有ProceedingJoinPoint参数

总结:
Aspectj表示切面执行时间,用的通知(Advice)。
这个通知可以使用注解表示。
5个注解表示切面的5个执行时间, 这些注解叫做通知注解

  • @Before : 前置通知
  • @AfterRetunring: 后置通知
  • @Around: 环绕通知
  • @AfterThrowing:异常通知
  • @After:最终通知

环绕置通知方法的定义
1)方法是public
2)方法是必须有返回值, 推荐使用Object类型
3)方法名称自定义
4)方法必须有ProceedingJoinPoint参数

public Object myAround(ProceedingJoinPoint pjp){
}

使用aspectj框架的注解,实现环绕通知

  1. 在业务接口中添加一个方法:doFirst
    在这里插入图片描述
    并实现这个方法
    在这里插入图片描述
    在这里插入图片描述
@Around 环绕通知 注解语法
@Around(value="切入点表达式")
  • 属性:value 切入点表达式

  • 位置:在方法定义的上面

  • 返回值:Object ,表示调用目标方法希望得到执行结果(不一定是目标方法自己的返回值)

  • 参数: ProceedingJoinPoint, 相当于反射中 Method。
    作用:执行目标方法的,等于Method.invoke()===方法执行

👇

@Around(value="execution(* *..SomeServiceImpl.doFirst(..))")
public Object myAround(ProceedingJoinPoint pjp){
	System.out.println("执行了环绕通知的myAround方法");
	return "Hello Around,不是目标方法的执行结果";
}

调用doFirst测试:
在这里插入图片描述
调用doFirst却执行了myAround。
👇手动实现:
在这里插入图片描述
调用doFirst只是形式上的,真实调用的是myAround(). 👇
在这里插入图片描述
myAround做什么,doFirst就做什么,myAround的返回值👉res
在这里插入图片描述
使用环绕通知: 就是调用切面类中的通知方法(myAround)。

特点

1.在目标方法的前和后都能增强功能
2.控制目标方法是否执行
3.修改目标方法的执行结果。

1.想要正常执行doFirst(目标方法):

在这里插入图片描述
查看ProceedingJoinPoint源码:
在这里插入图片描述
ProceedingJoinPoint代表正在执行的目标方法=doFirst
调用proceed就可以调用目标方法。
在这里插入图片描述
在这里插入图片描述

通过环绕通知可以执行切面类代码也可以控制目标方法(doFirst)的执行。

返回值可以保持不变👇
在这里插入图片描述

2.在目标方法的前和后都能增强功能:

在这里插入图片描述

3.修改目标方法的执行结果

在这里插入图片描述

4.如果目标方法参数是“王六六”就执行目标方法,否则不执行

获取方法执行时的参数值:pjp.getArgs()

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

在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

  • 26
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值