前言
继续上一篇讲的,上一篇所有的Advisor对象都已经收集完成,接下来就要看看有没有需要作用域当前正在实例化的bean的Advisors,如果有就生成代理对象
3.2 Advisor增强类对象与当前类的匹配
所有的Advisor收集完成后,接下来 与当前类 进行匹配 过滤。
先创建一个容器eligibleAdvisors,用来存匹配成功的Advisor对象,
3.2.1. 匹配类
canApply方法 ,取出pointCut来进行匹配
这里开始从Pointcut对象中获取ClassFilter对象,来调用matches方法,判断增强对象是否与当前类匹配
AspectJExpressionPointcut自己实现了ClassFilter接口,所以getClassFilter返回的自己
看看AspectJExpressionPointcut类的matches方法,接下来就是调用表达式对象来判断了,这里aspectj匹配表达式的比较复杂,就跳过了,这里是匹配类。
3.2.2. 匹配方法
接下来会Pointcut对象取出MethodMatcher对象,来对方法进行匹配
AspectJExpressionPointcut自己实现了MethodMatcher接口,所以getMethodMatcher()返回的自己
接下来会从正在实例化的bean的Class里取出所有方法,并遍历,看看MethodMatcher.getMethodMatcher()是否能匹配成功
其中一个匹配成功就返回true,就说明这个类有方法 是需要代理的,那么这个bean就需要生成代理对象,
在执行代理对象的方法时,哪个方法需要代理,那些不需要,会在代理的过程中进行 切面的筛选,这里只要判断有没有方法需要代理就行了。
方法匹配又是aspectj 的表达式匹配了,比较复杂,且不是重点,就不讲了。
当类匹配成功,且有方法也匹配成功,那么这个增强对象就会返回true,就会加入到匹配成功的advisor集合中
匹配过程就此结束。
3.3.3. 总结
遍历所有的advisor,先对类型进行匹配,匹配成功,再判断是否有方法匹配成功,有的话,那么advisor是可以应用于这个类的,那么 匹配成功的advisor集合中就会有他。
4.默认的advisor
当前 类 如果 能成功匹配到 advisor的话,那么aop就会默认 匹配成功的advisor集合的头部加一个ExposeInvocationInterceptor 类型的 advisor,用于在代理的过程中获取 aop上下文对象。
会先判断有没有@Aspect生成的切面,有@Aspect,说明是我们自定义的切面,那么就需要加入默认的切面
ExposeInvocationInterceptor
看下这个切面类,它实现MethodInterceptor方法,那么会实现这个接口的invoke方法
invoke方法
这个切面是第一个执行的,他会给invocation 设置aop上下文MethodInvocation对象,之后便打调用链传递下去,不影响后续切面的执行。
invocation 是一个ThreadLocal对象,后续的代理方法执行中可以获取到aop上下文MethodInvocation对象。
MethodInvocation methodInvocation = ExposeInvocationInterceptor.currentInvocation();
这就是这个切面类的 作用。