Spring5 底层原理 切点匹配(黑马)

Spring AOP 提供了多种匹配切点的方式,可以根据实际需求选择最合适的方式进行使用。在实际场景中,一般使用 AspectJ 表达式是最简单、最直观的方式。

演示 - 切点匹配

根据方法名字匹配

我们如图相匹配bar方法做增强,而不匹配foo方法(AspectJExpressionPointcut 是 Spring AOP 框架中用于封装 AspectJ 表达式的切点实现类):

  • 创建 AspectJExpressionPointcut
  • 添加表达式 setExpression(); 其中可以指定包名类名方法名等,我们这里指定类bar()
  • 调用matches方法判断目标类中的目标方法是否符合上面一步添加的表达式(参数一:目标方法,参数二:目标类)

在这里插入图片描述
很明显第一个不匹配,第二个匹配,期望结果为(第一行打印 false 第二行打印 true):
在这里插入图片描述

根据方法上加的注解匹配

步骤完全一样,重点看Expression中内容的变化,@annotation() 即为判断是否有注解的表达式,注意里面填的是对应注解的包名加类名
在这里插入图片描述
注解我们加在了foo上:

在这里插入图片描述

结果如下:

在这里插入图片描述

@Transactional 底层匹配实现

对于标注了@Transactional的方法,可以进行事务的开启,在这些功能的底层是否是用上文 根据方法上加的注解匹配的方式进行呢,答案是否定的,因为@Transactional注解不但能加方法上,还能加在类上、接口上等。

代码模拟

这里模拟利用一个抽象父类StaticMethodMatcherPointcut实现其方法matches(参数一:执行的方法对象,参数二:执行方法所在的类),这个方法如果匹配上返回true反之返回false

首先我们优先匹配方法上的,因为方法上有了,就可以直接返回,不用再去看类或者看接口,这里用一个spring 封装好的一个方法接口 MergedAnnotations
在这里插入图片描述
注意第二步这里我们在from方法给了第二个参数(参数为搜索策略),这里不给的话是会返回false的,原因是默认为(SearchStrategy.DIRECT)其意思为只会找本类中有没有加该注解,所以我们需要改变一下搜索策略(这里改变策略为在继承数上找)即可,结果如下;
在这里插入图片描述

测试代码如下

在这里插入图片描述

收获

  1. 常见 aspectj 切点用法
  2. aspectj 切点的局限性,实际的 @Transactional 切点实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aholic 冲冲冲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值