Spring AOP
2015-06-25 16:53
483 查看
Spring中的AOP(五)——在Advice方法中获取目标方法的参数
发表于1年前(2014-03-23 18:04) 阅读(5953) | 评论(5) 16人收藏此文章, 我要收藏赞4
7.16,杭州,阿里巴巴。阿里百川无线开放大会报名开启,用技术驱动无线新商业
摘要 本文介绍使用Spring
AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数。
SpringAOP args 目标方法 参数
获取目标方法的信息
访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:
Object[] getArgs:返回目标方法的参数
Signature getSignature:返回目标方法的签名
Object getTarget:返回被织入增强处理的目标对象
Object getThis:返回AOP框架为目标对象生成的代理对象
注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。
下面的切面类(依然放在com.abc.advice包中)中定义了Before、Around、AfterReturning和After 4中增强处理,并分别在4种增强处理中访问被织入增强处理的目标方法、目标方法的参数和被织入增强处理的目标对象等:
?
?
?
?
让切面类实现org.springframework.core.Ordered接口:实现该接口只需要实现一个int getOrder()方法,该方法返回值越小,优先级越高
直接使用@Order注解来修饰一个切面类:使用这个注解时可以配置一个int类型的value属性,该属性值越小,优先级越高
优先级高的切面类里的增强处理的优先级总是比优先级低的切面类中的增强处理的优先级高。例如:优先级为1的切面类Bean1包含了@Before,优先级为2的切面类Bean2包含了@Around,虽然@Around优先级高于@Before,但由于Bean1的优先级高于Bean2的优先级,因此Bean1中的@Before先被织入。
同一个切面类里的两个相同类型的增强处理在同一个连接点被织入时,Spring AOP将以随机的顺序来织入这两个增强处理,没有办法指定它们的织入顺序。如果确实需要保证它们以固有的顺序被织入,则可以考虑将多个增强处理压缩为一个增强处理;或者将不同增强处理重构到不同切面中,通过在切面级别上定义顺序。
如果只要访问目标方法的参数,Spring还提供了一种更加简洁的方法:我们可以在程序中使用args来绑定目标方法的参数。如果在一个args表达式中指定了一个或多个参数,该切入点将只匹配具有对应形参的方法,且目标方法的参数值将被传入增强处理方法。下面辅以例子说明:
?
注意,在定义returning的时候,这个值(即上面的returning="returnValue"中的returnValue)作为增强处理方法的形参时,位置可以随意,即:如果上面access方法的签名可以为
?
?
?
?
![](http://static.oschina.net/uploads/space/2014/0323/174904_iHXq_1434710.jpg)
从执行结果可以看出,使用args表达式有如下两个作用:
提供了一种简单的方式来访问目标方法的参数
可用于对切入点表达式作额外的限制
除此之外,使用args表达式时,还可以使用如下形式:args(param1, param2, ..),注意args参数中后面的两个点,它表示可以匹配更多参数。在例子args(param1, param2, ..)中,表示目标方法只需匹配前面param1和param2的类型即可。
《Spring中的AOP系列三、四、五》的代码在这里:点击下载,欢迎留言提意见。
【未完,待续】
相关文章推荐
- eclise 启动web Project facet Java version 1.7 is not supported
- spring和hibernate配置文件整合
- Eclipse快捷键
- Spring中如何配置Hibernate事务
- Spring声明式事务配置管理方法详解
- javaFX资料
- java web应用URL过滤
- java中的==、equals()、hashCode()源码分析 (转)
- SpringMVC自定义日期类型的数据绑定
- spring mvc提交日期类型参数
- SpringMVC日期类型转换问题三大处理方法归纳
- 理解Struts2配置
- java.util.ConcurrentModificationException解决方案
- java list
- 利用eclipse(MyEclipse)快速生成set、get方法的方法
- Java合并两个有序序列算法实现
- Eclipse web工程 部署 三种方式 1
- struts2 标签
- Java事务
- Java中Runnable和Thread的区别