Spring侧重于提供一种基于代理(proxy-based)的AOP实现,我们可以无缝的整合Spring AOP,IoC和AspectJ,使得所有的AOP应用完全融入基于Spring的应用体系。Spring目前仅支持使用方法调用作为连接点(join point),在Spring bean上通知方法的执行。
切入点指示符用来指示切入点表达式目的,Spring AOP支持的AspectJ切入点指示符如下:
切入点指示符说明execution方法签名需要满足execution中描述的方法签名within包或者类型满足within中描述的包或者类型的类的所有非私有方法thisSpring AOP 的代理实例的类型满足this中的描述的类型target业务实例对象(非代理实例)的类型满足target 中的描述的类型args方法的参数满参数类型为args中描述的类型@target类型拥有@target描述中给出的annotation@args方法运行时传入的参数的实际类型拥有@args描述中给出的annotation@within类型拥有@target描述中给出的annotatio@annotation方法拥有@annotation 描述中给出的annotationbean(idOrNameOfBean)bean的名字或者为bean描述中的名字或者Id切入指示符特性对比
切入点指示符切人元素织入方式通配符execution方法动态织入支持@annotation方法动态织入不支持within类静态织入支持@within类静态织入不支持target类动态织入不支持@target类动态织入不支持this类动态织入不支持bean类动态织入支持args方法参数动态织入支持@args方法参数动态织入不支持execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。
AspectJ使用 且(&&)、或(||)、非(!)来组合切入点表达式。
有两种获取通知参数的方式
使用JoinPoint获取:任何通知方法的第一个参数都可以是JoinPoint。然后使用jp.getArgs()就能获取到被通知方法参数:自动获取:除了execution和bean指示符不能传递参数给通知方法,其他指示符都可以将匹配的相应参数或对象自动传递给通知方法。JoinPoint参数类型
JoinPoint:提供访问当前被通知方法的目标对象、代理对象、方法参数等数据:ProceedingJoinPoint:用于环绕通知,使用proceed()方法来执行目标方法:JoinPoint.StaticPart:提供访问连接点的静态部分,如被通知方法签名、连接点类型等Spring AOP使用AspectJ的优先级规则来确定通知执行顺序。AspectJ根据@Order注解判断顺序,数字越大越晚通知。
spring2.5官方文档: http://shouce.jb51.net/spring/aop.html 开涛的博客:http://jinnianshilongnian.iteye.com/blog/1415606 开涛的代码: http://www.programcreek.com/java-api-examples/index.php?source_dir=javasousuo-master/javasousuo/springTest/spring/src/cn/javass/spring/chapter6/aop/PointcutAspect.java 我对AOP的理解:http://jinnianshilongnian.iteye.com/blog/1474325 Spring AOP 和 AspectJ 之间的差别 : http://blog.csdn.net/a128953ad/article/details/50509437