获取拦截器链MethodInterceptor
容器中保存了组件的代理对象,即CGLIB增强后的对象,这个对象里面保存了增强后的详细信息,包括增强器、目标对象等等
在执行目标方法div()
之前,会先去执行代理对象的拦截方法,即执行CglibAopProxy
的intercept()
方法
advised.getInterceptorsAndDynamicInterceptionAdvice()
方法会进一步调用advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice()
方法来获取目标方法的拦截器链
getInterceptorsAndDynamicInterceptionAdvice()
方法会遍历所有的增强器,调用registry.getInterceptors(advisor)
将其转换MethodInterceptor[] Interceptor
。最后会返回拦截器列表
返回的的拦截器列表就是拦截器链,实际上是每一个通知方法利用MethodInterceptor
机制,被包装为方法拦截器。
如果没有拦截器链,就会直接执行目标方法,如果有拦截器链就会创建CglibMethodInvocation
对象调用proceed()
方法触发拦截器链。