aspectj基本知识点

关于aspectj的基本知识点:


在使用 @AspectJ 之前,首先必须使用 JDK5.0 以上的版本。
Spring 支持九中 @AspectJ 切点表达式函数,他们使用不同的方式描述了目标类的连接点,根据描述对象的不同,可以大致分 为四类,分别是 :
1 :方法切点函数,通过描述目标类方法信息定义连接点。 execution(),@annotation()
2 :方法入参切点函数,通过描述目标类方法入参的信息定义连接点。 args() @args()
3 :目标代理类切点函数:通过描述目标类型信息定义连接点。 within() @within() target()
4 :代理类切点函数通过描述目标类的代理类的信息定义连接点。 @target() this()

@AspectJ 支持三种通配符:
*  :匹配任意字符,但它只能匹配上下文中的一个元素。
..  :匹配任意字符,可以匹配上下文中的多个元素,参数的代表
+  :  匹配指定类的所有类,必须跟在类后面,如: com.tz.aspectj.IUserService+
代表继承和扩展指定类的所有类,同时包括指定类本身。
 
@AspectJ 函数按其是否支持通配符及支持的程度可分为以下 3 类:
 
1 :支持所有通配符的有: execution(),within(), :within(com.tz.user.*)
2 :仅支持 + 通配符的有 :args(),this(),target(), args(com.tz.User+)
3 :不支持通配符的有: @args,@within(),@target(),@annotation()
@AspectJ 提供了三种逻辑运算符分别是:
&&  : 与操作,相当于切点的交集运算,它可以用 and 替换。如: within(com.user.*)and args(String) 表示 com.user 包下所有的类(当前包以及子孙包)拥有一个 String 入参的方法
||   : 或操作。相当于切点的并集运算,他可以用 or 替换。如: within(com.user.*)and args(String) 表示在 com.user 包下所有的类(当前包以及子孙包)的方法或者所有拥有一个 String 入参的方法
! :非操作,相当于切点反集运算,它可以用 not 替换 , 就是一个过滤而已。入:
within(com.user.*) and not args(String) 表示 com.user 包下所有的类的方法排除只有一个入参为 String 方法。
 
如果 not 位于切点开头,必须在前面加入一个空格 [ 空格 ] not within(com.user.*)

增强类型
描述
@Before
相当于 :BeforeAdvice 前置通知
@AfterReturning
相当于 AfterRetruingAdvice 后置通知
@Around
相当于 :MethodInterceptor 环绕通知
@AfterThrowing
相当于 ThrowsAdvice 异常通知
@After
用于释放资源的时候 Final 增强
@DeclareParents
相当于 :IntroductionInterceptor 引介增强
 

execution属于方法切点函数:
1:方法匹配模式串。                                 
2 :标识满足某一匹配模式的所有目标类方法连接点,如 execetion(* saveUser(..)) 表示匹配目标类中所有的 saveUser() 的方法 .
格式如下: execution(< 修饰符模式 >? < 返回类模式 >< 方法名模式 >(< 参数模式 >) < 异常模式 >?)
除了返回类型,方法名模式和参数模式外,其他项都是可选的。
 
a: 通过方法前面定义切点:
execution(public * *(..)):
匹配所有目标类的 public 方法,第一 * 代表返回类型,第二 * 代表方法名,而 (..) 代表任意入参的方法。
execution(* *To(..))
匹配目标中所有以 To 为后缀的方法。

b:execution(*com.tz.user.IUserService.*(..))
匹配接口 IUserService 的所有方法,它匹配 UserService 的所有方法,第一 * 代表返回任意类型,
execution(*com.tz.user.IUserService+.*) 匹配 IUserService 接口中所有的方法,它是一个增强的拦截匹配。
 
c: 通过类包定义切点 : 在类名模式中, ".*" 表示包下所有类,而 "..*" 表示包,子孙包下的所有类。
.  execution(* com.tz.user.*(..)) 表示包下的所有类的所有方法
.  execution(* com.tz.user..*(..)) 表示包下所有类,及子孙类的所有方法 .
. execution(* com..*.*Dao.find*(..)): 表示 com 包下任何包下类名后缀为 Dao 的方法,方法名必须以 find 为前 缀的方法 .
d: 通过方法入参定义切点:
. execution(* find(String,int)): 代表匹配任意返回值,以 find 为方法名,第一个参数是 String, 第二个参数是 int 的方法 .
 
. execution(* find(String,*)) 代表匹配任意返回值,以 find 为方法名,第一个参数是 String, 第二个参数是任 意类型 . find(String,int) find(String,double)
 
.execution(* find(String,..)) 代表第一个入参 String, 后面可以有任意且没有都 .find(String),find(String,int) 个数匹配就行了。
 
.execution(* find(Object+)) 匹配 find(String) find(Client) 等,但是如果是 execution(Object) 则只能匹配 find(Object);

猜你喜欢

转载自201407105131.iteye.com/blog/2204958