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