AspectJ方式在通知中获取切点参数
要知道Spring Schema-based方式实现环绕通知带有参数
上次的代码实现前置通知获取切点函数输入值,方法,方法名,对象。
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实现前置(保留前置通知)
上图(..)表示切点对应的任意类型
demo切点实现有输入代码
切点前置通知获取切点的输入值并打印(表明我另一个程序切点的切片操作获取了主程序切点的输入值)
测试是否切片操作是否能获取切点输入(代码输入 张三+12)
结果:(切点不能绑定?????)
具体怎么回事?上节Scheme-base讲到使用通配符需要要指明参数类型
实现方法:
注意:里面的name,age 红色标记,下面的name+age是来调用切点获取的参数
代码实例:
(这里配置文件方法名,传入名一定要相同)
————————————————————————————————————————————————————————————————————————————————————————
<?xml version="1.0" encoding="UTF-8"?>
前置通知改为:
通配符书写报错-纠正:(* com.wq.test.Demo.Deom1(String,int))and args(name,age)
<?xml version="1.0" encoding="UTF-8"?>
测试结果:
若demo1只有一个参数输入(String)
结果第二个Demo1并没有出现前置
原来AspectJ方式配置严格定义类型
新建立一个切点配置
新建一个前置处理方法
结果:
总结:
1.新建一个类,不用实现
类中方法名任意
2.配置applicationContext.xml配置文件
· 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" 要和通知类的方法名相同