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
    评论
Spring AOP (Aspect Oriented Programming) 是 Spring 框架中的一个模块,它实现了面向切面编程,允许开发者将横切关注点(如事务管理、日志记录、安全检查等)抽取到独立的模块中,从而避免代码重复和提高模块的可维护性。Spring AOP 的底层原理主要基于以下几个关键概念: 1. **通知(Advice)**: 是 AOP 的核心,它是对目标方法执行前后的行为进行增强的代码片段。Spring 提供了五种类型的通知:前置通知(Before)、后置通知(After)、返回后通知(AfterReturning)、异常通知(AfterThrowing)和最终通知(Around)。 2. **切点(Pointcut)**: 定义了一组相关的通知应该何时何地应用。Spring 使用表达式语言(如`@annotation`, `@execution`, `@target`, `@within`等)来定义切点匹配方法执行的条件。 3. **连接点(Join Point)**: 是程序执行过程中的一点,是通知被应用的地方。Spring AOP 检查通知的匹配条件并在合适的时候执行。 4. **代理(AOP Proxy)**: Spring AOP 实现了一种特殊的代理机制,为被拦截的目标对象创建一个代理对象。有两种代理模式:JDK 动态代理和 CGLIB 生成的字节码代理。对于接口,使用 JDK 动态代理;对于类,如果目标类没有实现接口或没有 final 方法,使用 CGLIB。 5. **切面(Angle)**: 是一组相关通知的集合,由切点和通知组成。在 Spring 中,切面通过 `@Aspect` 注解声明,`@AspectJ` 是其底层语法支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Aholic 冲冲冲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值