前言
本篇是Spring核心知识系列的最后一篇,下次就要开始SpringBoot相关的更新。虽然已经使用SpringBoot有一段时间,但我觉得还是有必要先从Spring聊起。所以我把Spring相关知识又梳理了一遍,有了这几篇文章。记住,当人们都在大火猛炒的时候,你蒸的那锅老粥就弥足珍贵了!
本篇是关于AspectJ在Spring中使用的一些补充知识。具体如下:
切点表达式通配符:
上篇文章详细介绍了Spring中使用AspectJ来进行切面编程,介绍了10种切点函数。切点函数在编写过程中,非常灵活,可以使用一些通配符进行匹配。
@AspectJ支持以下3种通配符。
*: 匹配任意字符,但它只能匹配上下文中的一个元素。
//匹配任何public 的方法,返回值,方法名,和参数都匹配任意。
execution(public * *(..))
//匹配所有以To结尾的方法
execution(* *To(..))
… : 匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和*联合使用,在表示入参时则单独使用。
//匹配com.smart包下,任何 TOTO
within(com. smart. service..*.*Service+)
+:表示按类型匹配指定类的所有类,必须跟在类名后面,如com.smart.Car+。继承或扩展指定类的所有类,同时还包括指定类本身。
@AspectJ函数按其是否支持通配符及支持的程度,可以分为以下3类。
-
支持所有通配符:
execution()、within()
如within(com.smart.*)、within(com. smart. service…*.*Service+)等。
-
仅支持+通配符:
args()、this()、target()
如args(com.smart.Waiter+)、target(java.util.List+)等
-
不支持通配符:
@args()、@within()、@target()和@annotation()
如@args com.smart. anno.NeedTest)和@within(com.smart.anno.NeedTest
切点表达式逻辑运算:
切点表达式由切点函数组成,切点函数之间还可以进行逻辑运算,组成复合切点,Spring支持以下的切点运算符。
- &&: 与操作符,Spring中提供了等效的运算符 “and”
如:within(com.smart…*) and args(String)
表示在com.smart包下的所有类(当前包和子孙包)拥有一个String入参的方法。
- ||: 或操作符,or 是等效的操作符。
- ! :非操作符,not是等效操作符
不同增强类型常用注解:
-
@Before:
表示前置增强。相当于BeforeAdvice.
它有两个成员,value :用于定义切点。argNames:运行期解析相关。
如:@Before(value = “execution(public * *(…))”)
一般默认不写默认就是value的值,如:@Before(“execution(public * *(…))”)。
下面几种也类似,有各自的成员,但每个都有value成员。
-
@AfterReturning :
表示后置增强,相当于AfterReturningAdvice
-
@Around
环绕增强,相当于MethodInterceptor
-
AfterThrowing
抛出异常增强,相当于ThrowsAdvice
-
@After
表示final增强,该增强总会执行。
-
@DeclareParents
表示引介增强,相当于IntroductionInterceptor
它的两个成员是,value, defaultImpl:默认的接口实现类
关于几种增强的示例见码云
总结:
基于AspectJ,在Spring中我们可以通过注解的方式生成切面,关于切点的匹配我们需要根据业务需求,编写切点表达式,其中可以通过通配符进行灵活的匹配。同时多个切点表达式又可以做逻辑运算,形成更加细致的匹配层次。有关不同类型的增强注解,本质和对应的是AOP中的增强接口。