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