获取方法参数_AspectJ方式在通知中获取切点参数

本文详细介绍了如何在AspectJ的通知中通过配置获取切点参数。首先展示了Spring Schema-based方式的前置通知获取参数,然后重点讲解了AspectJ方式的实现步骤,包括配置文件的修改和错误修正。文中指出AspectJ方式对于参数类型的定义较为严格,并提供了正确的配置示例。
摘要由CSDN通过智能技术生成

AspectJ方式在通知中获取切点参数

要知道Spring Schema-based方式实现环绕通知带有参数

d0d40b965e15e4584c085805a11ff7f0.png

上次的代码实现前置通知获取切点函数输入值,方法,方法名,对象。

import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class MyBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { // TODO Auto-generated method stub System.out.println("输出执行前置通知"); System.out.println("切点方法对象:"+arg0+",方法名:"+arg0.getName()); /*System.out.println("切点方法参数:"+arg1);//数组 */ System.out.println("对象:"+arg2); if (arg1!=null&&arg1.length>0) {//表示有参数传入 System.out.println("切点方法参数:"+arg1[0]);//因为只有一个String参数 }else { System.out.println("切点没有参数"); } } }

AspectJ方式在通知中获取切点参数怎么实现?

实现代码步骤示例:(接上节代码的续集)

applicationContext.xml实现前置(保留前置通知)

65ba5c7223de61a25d7ceb2babe14be1.png

上图(..)表示切点对应的任意类型

demo切点实现有输入代码

bb0ee75a833a72b107df508328b344ca.png

切点前置通知获取切点的输入值并打印(表明我另一个程序切点的切片操作获取了主程序切点的输入值)

51feb663105569dd66456cb71c580ef5.png

测试是否切片操作是否能获取切点输入(代码输入 张三+12)

061c469f3ce0778b0193b9a93d663a8b.png

结果:(切点不能绑定?????)

db42b51cdad077dbf82e66ec838ca21a.png

具体怎么回事?上节Scheme-base讲到使用通配符需要要指明参数类型

实现方法:

9c6f889c3c49070bf4b6db8e93618f7c.png

注意:里面的name,age 红色标记,下面的name+age是来调用切点获取的参数

c84f20c16e5ca036c679e7af69fec318.png

代码实例:

(这里配置文件方法名,传入名一定要相同)

————————————————————————————————————————————————————————————————————————————————————————

<?xml version="1.0" encoding="UTF-8"?>

前置通知改为:

fddabd897abf0591266e8c78434b51b6.png

通配符书写报错-纠正:(* com.wq.test.Demo.Deom1(String,int))and args(name,age)

3c75271ce4dbede57ede6eaaede6c14f.png
<?xml version="1.0" encoding="UTF-8"?>

测试结果:

add07a2e563445aa85c9793dbd51c5e6.png

若demo1只有一个参数输入(String)

a6a4c11a6edea9aba0f582bf14cbbb4d.png
dbd8f359bc38fa214f35156a24ff6d65.png

结果第二个Demo1并没有出现前置

950c679408101f7968defd2fbc48ca8a.png

原来AspectJ方式配置严格定义类型

新建立一个切点配置

79aed68879e57e9545451e19fb1347ee.png

新建一个前置处理方法

b1869422e478440d550abbb5b3300861.png

结果:

f2cdba1144b1c83d15872b34798a2472.png
9b120b219c24e52ce7b465e3719114b9.png


总结:

1.新建一个类,不用实现

类中方法名任意

22578acc3a7805a92010b5dacdc2aef0.png

2.配置applicationContext.xml配置文件

15c6f5a3fe0cc8971de42e87e9fd8ffa.png

· aop:after 后置通知,是否出现异常都执行

· aop:after-returning: 后置通知,只有当切点正确执行时才能执行(异常不执行)

· aop:after 和aop:after-returning: 和aop:after-throwing 执行顺序和配置顺序有关

· execution() 括号不能扩args, 中间使用and不能使用&&,由Spring把and解析成java的&&

· args()的名称是自定义的,顺序要和com.wq.test.Demo.Deom1(String,int)参数对应

· 的类型名来源于args()名称必须相同,参数种类也相同

· arg-names="name" 要和通知类的方法名相同


在Java,AOP(面向切面编程)是一种编程范式,它允许我们在程序运行时动态地将额外的逻辑织入到现有的代码。在AOP,我们可以通过切面来定义我们想要添加的逻辑,而切点则指定了我们想要在哪些地方应用这些逻辑。 要获取方法参数值,可以使用AspectJ框架提供的注解和API。下面是一种常见的方法: 1. 首先,需要在切面类上添加`@Aspect`注解,表示这是一个切面类。 2. 使用`@Before`注解来定义一个前置通知,在方法执行之前执行。 3. 在前置通知方法,可以使用`JoinPoint`参数获取方法参数值。 4. 使用`JoinPoint`的`getArgs()`方法可以获取方法参数数组。 5. 遍历参数数组,即可获取到每个参数的值。 下面是一个示例代码: ```java import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class MyAspect { @Before("execution(* com.example.MyClass.myMethod(..))") public void beforeMethod(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); for (Object arg : args) { System.out.println("参数值:" + arg); } } } ``` 在上述示例,`execution(* com.example.MyClass.myMethod(..))`表示切点表达式,指定了要拦截的方法。在`beforeMethod`方法,通过`joinPoint.getArgs()`获取方法参数数组,并进行遍历打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值