关于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);