spring aop产生的代理对象执行流程及相关核心类的作用
- 入口:JdkDynamicAopProxy#invoke方法
- 重要代码分析:
- List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
- chain集合中存储的是【Advice】类封装之后MethodInterceptor或者想要的Adapter
- 在该代码执行之前,我们已经针对该targetClass获取到了对应的【Advisor集合】,最终想要的是【MethodInterceptor集合】
- Advisor--->getAdvice--->封装MethodInterceptor
- Advice:
- 五种通知
- 通知会调用自定义编写的【增强代码】
- Advisor和Advice的关系
- 一个Advisor(PointcutAdvistor)是封装了一个Advice(五种通知),同时还封装成了对应的Pointcut对象(AspectJExpressionPointcut)
- Advice和MethodInterceptor的关系是什么
- Advice接口是MethodInterceptor父接口
- Advice有五个实现类,也就是五种通知,但是只有三种是实现MethodInterceptor接口(AspectJAfter、AspectJAroundAdvice、AspectJAfterThrowingAdvice)
- Advice另外的两个通知,要想和MethodInterceptor建立关系,需要使用适配器模式
- AfterReturnningAdviceAdapter:AfterReturnningAdvice------>MethodInterceptor
- ThrowsAdviceAdapter:AspectJMethodBeforeAdviceAdvice----->MethodInterceptor===》没有被用到
- MethodBeforeAdviceAdapter:AspectJThrowsAdviceAdvice----->MethodInterceptor
- Advice为什么要封装成MethodInterceptor
- MethodInterceptor提供了一个接口功能叫intercept,使用此方法完成执行方法的拦截,方便执行增强功能;
- MethodInterceptor相当于针对五钟通知有五个实现类,每个实现类都需要去完成方法拦截和【方法顺序的控制】
- 一个目标对象可以被多个增强功能去增强,最终只会产生一个代理对象
- 多个增强功能的执行顺序是如何保证的呢?
- 【不同通知类型】的执行顺序是通过MethodInterceptor实现类去保证的;
- 【同种通知类型】的执行顺序是通过对advice的加载顺序(xml顺序或者注解处理的顺序)去保证的;
- 多个增强功能的执行顺序是如何保证的呢?
- Advice:
- ReflectiveMethodInvocation的解析:
- 由它完成MethodInterceptor拦截到的方法是应该如何一个一个的执行
- 编写流水线执行流程
- 它将Advice封装成一个调用链
invoke方法就是调用被增强类的方法
- chain集合中存储的是【Advice】类封装之后MethodInterceptor或者想要的Adapter
- List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);