AspectJ

来源:互联网 发布:go语言 python 编辑:程序博客网 时间:2024/06/05 10:20

简介

AOP有很多种实现方式,比如说Jboss Aop和spring原生的Spring Aop。当然,spring很好的兼容了aspectj。区别在于,spring aop采取的是动态织入,而aspcetj采取的是静态织入。所以,spring原生aop必须要在运行时由ioc容器管理,而aspectj则需要使用其自己的编译器。aspectj和spring aop一样,都可以使用注解方便的实现。

术语

pointcut程序执行点的集合,本身是一个表达式,基于正则语法
joinPoint在上述集合种选取的某一个具体的执行点
Advice中文常常被叫做通知。有四种类型:

  • before advice 在方法执行前执行。
  • after returning advice 在方法执行后返回一个结果后执行。
  • after throwing advice 在方法执行过程中抛出异常的时候执行。
  • Around advice 在方法执行前后和抛出异常时执行,相当于综合了以上三种通知。

joinpoint介绍

AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。

这两个接口的主要方法:

  • java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
  • Signature getSignature() :获取连接点的方法签名对象;
  • java.lang.Object getTarget() :获取连接点所在的目标对象;(也就是被代理的对象)
  • java.lang.Object getThis() :获取代理对象本身;

ProceedingJoinPoint ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:

  • java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;

  • java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。

pointcut介绍

pointcut表达式
execution():

任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service..(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service...(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))”)
*> 最靠近(..)的为方法名,靠近.(..))的为类名或者接口名,如上例的JoinPointObjP2.(..))

原创粉丝点击