- 参考资料
- 源码分析
- 1、拦截目标方法的执行
- 1.1、获取拦截器链
- `DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice()`
- `DefaultAdvisorAdapterRegistry#getInterceptors()`
- 1.2、如果没有拦截器链
- 1.3、如果有拦截器链
- 视频 - AOP原理-获取拦截器链-MethodInterceptor
本篇文章主要是分析目标方法的执行过程。
源码分析
增强器里面包含了之前文章中分析的四个自定义通知方法。
DynamicAdvisedInterceptor#intercept()
根据 ProxyFactory 对象获取将要执行的目标方法拦截器链 getInterceptorsAndDynamicInterceptionAdvice() 。
AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice()
getInterceptorsAndDynamicInterceptionAdvice() 方法将所有拦截器封装在 List
该集合的长度是5,包含一个默认的 ExposeInvocationInterceptor 和 4个自定义增强器。
遍历所有的增强器,将其转为 Interceptor (MethodInterceptor 继承了 Interceptor)。
-
如果是 MethodInterceptor,直接加入到集合中。
interceptors.add((MethodInterceptor) advice); -
如果不是,使用 AdvisorAdapter 将增强器转为 MethodInterceptor。
interceptors.add(adapter.getInterceptor(advisor)); -
转换完成返回 MethodInterceptor 数组。
return interceptors.toArray(new MethodInterceptor[interceptors.size()]);
综上,所谓拦截器链,实际上是每一个通知方法被包装成了方法拦截器 MethodInterceptor 再放到集合中。
如果没有拦截器链,直接执行目标方法。
如果有拦截器链,把需要执行的目标对象,目标方法拦截器链等信息传入创建一个 CglibMethodInvocation 对象,并调用 proceed() 方法。



