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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值