美文网首页
【Spring源码】21.AOP之切面的匹配

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

作者: 天还下着毛毛雨 | 来源:发表于2023-02-09 20:15 被阅读0次
    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();
    

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

    相关文章

      网友评论

          本文标题:【Spring源码】21.AOP之切面的匹配

          本文链接:https://www.haomeiwen.com/subject/vwshkdtx.html