Spring中使用AspectJ通配符&逻辑运算符

前言

​ 本篇是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中的增强接口。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值