先小结一下:
args()是用来匹配并且接收目标方法的参数的.
argNames(用在注解中)与arg-names(用在XML中),他们是同一个东西.
argNames用来接收AspectJ表达式中的参数(其中也包含args).
可以通过调整argNames参数名的顺序,来调整参数传值的顺序.
==========================schema===========================
==========================aspectJ===========================
=========================================================
下面是一些补充:
1.Spring本身对AOP的支持并不是很好,所以后来引入了AspectJ.
2.Spring支持两种风格,Schema(XML配置), 以及AspectJ(注解配置).(参考地址)
3.Schema风格XML配置时切入点语法默认是AspectJ语法.
4.args说明: AspectJ语法,通常出现在定义切入点时
XML配置时
-- 注意是使用and链接
<aop:pointcut expression="execution(* *.*(..)) and arg(paramName)"/>
<aop:(before|after|..) pointcut="execution(* *.*(..)) and args(paramName)", arg-names="paramName"/>
注解配置时
// 如果在@Pointcut中定义了args,那么也要定义argNames,并且两者的参数名称必须一样,顺序可以不一样,(有其他作用)
// 注意是使用&&链接
@Pointcut(value="execution(* *.*(..)) && args(paramName)", argNames="paramName")
5.arg-names说明:
XML配置时
<aop:(before|after|..) ... arg-names="paramName"/> // 通知方法的定义中
注解配置时
@Pointcut(...,argNames="paramName") // 切入点的定义中
@Before(..., argNames="paramName") // 通知方法的定义中
6.args可以用来定义目标方法必须要具备的参数个数,而且执行通知的方法也必须带相同个数参数|或者不带参数. 提示:通知方法中的参数类型可以是目标参数的类型或者目标参数的父类型.(推理一下如果通知方法与目标方法类型不一致会直接导致ClassCastException异常)
7.args与args-names是引用的关系,并且是根据参数名称来传递值(不是顺序),所以参数名字必须一致
-- 我猜是args的参数值传递给argNames,
8.基于注解配置时更特殊,除上面两种约束之外
在@pointcut中args与args-names必须成对出现
9.AspectJ语法(参考地址)
=============================代码===============================
参考博客:
http://jinnianshilongnian.iteye.com/blog/1418598(基于Schema的AOP)
http://jinnianshilongnian.iteye.com/blog/1420689(基于@AspectJ的AOP)
http://www.cnblogs.com/powerwu/p/5211611.html
http://www.myexception.cn/software-architecture-design/1824664.html
参考代码:暂无
欢迎转载,文章出处:https://my.oschina.net/longfong/blog/805410