一、切面类型概述
aop类型 | 解释 |
---|---|
execution() |
匹配方法执行的连接点, 详见下一个表格 |
args() |
匹配当前执行的方法传入的参数为指定类型的执行方法 |
this() |
匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配 |
target() |
匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配 |
within() |
匹配指定类型内的方法执行 |
@target() |
匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解 |
@within() |
匹配所有持有指定注解类型内的方法 |
@annotation() |
匹配当前执行方法持有指定注解的方法 |
@args() |
匹配当前执行的方法传入的参数持有指定注解的执行 |
定义@Pointcut时,可以使用 &&、||、! 逻辑运算符来叠加多种不同的类型
通配符说明
通配符 | 解释 |
---|---|
* |
匹配任何数量字符 |
.. |
匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。 |
+ |
匹配指定类型的子类型;仅能作为后缀放在类型模式后边。 |
二、详细说明
1、execution:
execution用来切入指定的方法, 格式:
execution(<修饰符**?**> <返回值> <类路径**?**> <方法名>(<参数类型>) <异常类型**?**>)
选项 | 解释 |
---|---|
修饰符 | 可选, 如public 表示匹配公有方法 |
返回值 | * 表示任何返回值,全路径的类名等 |
类路径 | 可选 |
方法名 | * 代表所有,set*,代表以set开头的所有方 |
参数类型 | 指定方法参数(声明的类型): (..)代表所有参数 ()代表没有参数 (,String)代表第一个参数为任何值,第二个为String类型 |
异常类型 | 可选 |
详细例子:
示例 | 描述 |
---|---|
public * *(..) |
任何公共方法的执行 |
* com.popo..IPointcutService.*() |
com.popo 包及所有子包下IPointcutService 接口中的任何无参方法 |
* com.popo..*.*(..) |
com.popo 包及所有子包下任何类的任何方法 |
* com.popo..IPointcutService.*(*) |
com.popo 包及所有子包下IPointcutService接口的任何只有一个参数方法 |
* (!com.popo..IPointcutService+) .*(..) |
非com.popo 包及所有子包下IPointcutService接口及子类型”的任何方法 |
* com.popo..IPointcutService+.*() |
com.popo 包及所有子包下IPointcutService 接口及子类型的的任何无参方法 |
* com.popo..IPointcut*.test*(java.util.Date) |
com.popo 包及所有子包下IPointcut 前缀类型的的以test开头的只有一个参数类型为java.util.Date 的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的,如定义方法:public void test(Object obj) ;即使执行时传入java.util.Date,也不会匹配的; |
* com.popo..IPointcut*.test*(..) throws IllegalArgumentException,ArrayIndexOutOfBoundsException,com.popo |
包及所有子包下IPointcut前缀类型的的任何方法,且抛出IllegalArgumentException 和ArrayIndexOutOfBoundsException 异常 |
* (com.popo..IPointcutService+&& java.io.Serializable+).*(..) |
任何实现了com.popo 包及所有子包下IPointcutService 接口和java.io.Serializable 接口的类型的任何方法 |
@java.lang.Deprecated * *(..) |
任何持有@java.lang.Deprecated 注解的方法 |
@java.lang.Deprecated @com.popo..Secure* *(..) |
任何持有@java.lang.Deprecated 和@com.popo…Secure 注解的方法 |
(@com.popo..Secure*) *(..) |
任何返回值类型持有@com.popo…Secure 的方法 |
*(@com.popo..Secure*).*(..) |
任何定义方法的类型持有@com.popo…Secure 的方法 |
**(@com.popo..Secure(*) ,@com.popo..Secure(*)) |
任何签名带有两个参数的方法,且这个两个参数都被@ Secure标记了,如public void test(@Secure String str1, @Secure String str1);
|
**((@ com.popo..Secure *))或**(@ com.popo..Secure*) |
任何带有一个参数的方法,且该参数类型持有@ com.popo…Secure ;如public void test(Model model) ;且Model类上持有@Secure注解 |
* *(@com.popo…Secure (@com.popo…Secure *) ,@ com.popo…Secure (@com.popo…Secure *)) |
任何带有两个参数的方法,且这两个参数都被@ com.popo…Secure 标记了;且这两个参数的类型上都持有@ com.popo…Secure ; |
* *(java.util.Map<com.popo…Model, com.popo…Model>, …) |
任何带有一个java.util.Map 参数的方法,且该参数类型是以< com.popo…Model, com.popo…Model > 为泛型参数;注意只匹配第一个参数为java.util.Map ,不包括子类型;如public void test(HashMap<Model, Model> map, String str) ;将不匹配,必须使用\* \*(java.util.HashMap<com.popo…Model,com.popo…Model>, …) 进行匹配;而public void test(Map map, int i) ;也将不匹配,因为泛型参数不匹配 |
* *(java.util.Collection<@com.popo…Secure *>) |
任何带有一个参数(类型为java.util.Collection )的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@com.popo…Secure 注解;如public void test(Collection collection) ;Model类型上持有@com.popo…Secure
|
* *(java.util.Set<? extends HashMap>) |
任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型继承于HashMap ;Spring AOP目前测试不能正常工作 |
* *(java.util.List<? super HashMap>) |
任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是HashMap 的基类型;如public voi test(Map map) ;Spring AOP目前测试不能正常工作 |
* *(*<@com.popo…Secure *>) |
任何带有一个参数的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@com.popo…Secure 注解;Spring AOP目前测试不能正常工作 |
2、within
“within(类型表达式)”匹配指定类型内的方法执行;
示例 | 描述 |
---|---|
within(com.popo..*) |
com.popo 包及子包下的任何方法执行 |
within(com.popo..IPointcutService+) |
com.popo 包或所有子包下IPointcutService 类型及子类型的任何方法 |
within(@com.popo..Secure *) |
持有com.popo…Secure 注解的任何类型的任何方法必须是在目标对象上声明这个注解,在接口上声明的对它不起作用 |
3、this
使用“this(类型全限定名)”匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口方法也可以匹配;注意this中使用的表达式必须是类型全限定名,不支持通配符;
示例 | 描述 |
---|---|
this(com.popo.spring.chapter6.service.IPointcutService) |
当前AOP对象实现了IPointcutService 接口的任何方法 |
this(com.popo.spring.chapter6.service.IIntroductionService) |
当前AOP对象实现了 IIntroductionService 接口的任何方法 |
4、target
使用“target(类型全限定名)”匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;注意target中使用的表达式必须是类型全限定名,不支持通配符;
示例 | 描述 |
---|---|
target(com.popo.spring.chapter6.service.IPointcutService) |
当前目标对象(非AOP对象)实现了 IPointcutService 接口的任何方法 |
target(com.popo.spring.chapter6.service.IIntroductionService) |
当前目标对象(非AOP对象) 实现了IIntroductionService 接口的任何方法, 不可能是引入接口 |
5、args
使用“args(参数类型列表)”匹配当前执行的方法传入的参数为指定类型的执行方法;注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用;
示例 | 描述 |
---|---|
args (java.io.Serializable,…) |
任何一个以接受“传入参数类型为 java.io.Serializable ” 开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的 |
6、@within
使用“@within(注解类型)”匹配所有持有指定注解类型内的方法;注解类型也必须是全限定类型名;
示例 | 描述 |
---|---|
@within(com.popo.spring.chapter6.Secure) |
任何目标对象对应的类型持有Secure注解的类方法; |
7、@target
使用“@target(注解类型)”匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;注解类型也必须是全限定类型名;
示例 | 描述 |
---|---|
@target (com.popo.spring.chapter6.Secure) |
任何目标对象持有Secure注解的类方法;必须是在目标对象上声明这个注解,在接口上声明的对它不起作用 |
8、@args
使用“@args(注解列表)”匹配当前执行的方法传入的参数持有指定注解的执行;注解类型也必须是全限定类型名;
示例 | 描述 |
---|---|
@args (com.popo.spring.chapter6.Secure) |
任何一个只接受一个参数的方法,且方法运行时传入的参数持有注解 com.popo.spring.chapter6.Secure ;动态切入点,类似于arg指示符; |
9、@annotation
使用“@annotation(注解类型)”匹配当前执行方法持有指定注解的方法;注解类型也必须是全限定类型名;
示例 | 描述 |
---|---|
@annotation(com.popo.spring.chapter6.Secure ) |
当前执行方法上持有注解 com.popo.spring.chapter6.Secure 将被匹配 |
10、bean
使用“bean(Bean id或名字通配符)”匹配特定名称的Bean对象的执行方法;Spring AOP扩展的,在AspectJ中无相应概念;
示例 | 描述 |
---|---|
bean(*Service) |
匹配所有以Service 命名(id或name)结尾的Bean |