【Spring源码】21.AOP之切面的匹配

image

前言

继续上一篇讲的,上一篇所有的Advisor对象都已经收集完成,接下来就要看看有没有需要作用域当前正在实例化的bean的Advisors,如果有就生成代理对象

3.2 Advisor增强类对象与当前类的匹配

所有的Advisor收集完成后,接下来 与当前类 进行匹配 过滤。

image
image

先创建一个容器eligibleAdvisors,用来存匹配成功的Advisor对象,

image

3.2.1. 匹配类

canApply方法 ,取出pointCut来进行匹配

image

这里开始从Pointcut对象中获取ClassFilter对象,来调用matches方法,判断增强对象是否与当前类匹配

AspectJExpressionPointcut自己实现了ClassFilter接口,所以getClassFilter返回的自己

image
image

看看AspectJExpressionPointcut类的matches方法,接下来就是调用表达式对象来判断了,这里aspectj匹配表达式的比较复杂,就跳过了,这里是匹配类。

image

3.2.2. 匹配方法

接下来会Pointcut对象取出MethodMatcher对象,来对方法进行匹配

AspectJExpressionPointcut自己实现了MethodMatcher接口,所以getMethodMatcher()返回的自己

image
image

接下来会从正在实例化的bean的Class里取出所有方法,并遍历,看看MethodMatcher.getMethodMatcher()是否能匹配成功

其中一个匹配成功就返回true,就说明这个类有方法 是需要代理的,那么这个bean就需要生成代理对象,

在执行代理对象的方法时,哪个方法需要代理,那些不需要,会在代理的过程中进行 切面的筛选,这里只要判断有没有方法需要代理就行了。

image

方法匹配又是aspectj 的表达式匹配了,比较复杂,且不是重点,就不讲了。

image

当类匹配成功,且有方法也匹配成功,那么这个增强对象就会返回true,就会加入到匹配成功的advisor集合中

image
image

匹配过程就此结束。

3.3.3. 总结

遍历所有的advisor,先对类型进行匹配,匹配成功,再判断是否有方法匹配成功,有的话,那么advisor是可以应用于这个类的,那么 匹配成功的advisor集合中就会有他。

4.默认的advisor

当前 类 如果 能成功匹配到 advisor的话,那么aop就会默认 匹配成功的advisor集合的头部加一个ExposeInvocationInterceptor 类型的 advisor,用于在代理的过程中获取 aop上下文对象。

image
image

会先判断有没有@Aspect生成的切面,有@Aspect,说明是我们自定义的切面,那么就需要加入默认的切面

image

ExposeInvocationInterceptor

看下这个切面类,它实现MethodInterceptor方法,那么会实现这个接口的invoke方法

image

invoke方法

这个切面是第一个执行的,他会给invocation 设置aop上下文MethodInvocation对象,之后便打调用链传递下去,不影响后续切面的执行。

image

invocation 是一个ThreadLocal对象,后续的代理方法执行中可以获取到aop上下文MethodInvocation对象。

MethodInvocation methodInvocation = ExposeInvocationInterceptor.currentInvocation();

这就是这个切面类的 作用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容