链式调用通知方法
在目标方法执行之前,会把所有的增强器转为MethodInterceptor
类型的拦截器,变成一个拦截器链,根据这个拦截器链会创建出CglibMethodInvocation
对象,进而调用这个对象的proceed()
方法来触发拦截器链。
返回InterceptorList
拦截器链并缓存起来
代理对象获取到拦截器链
接着会创建CglibMethodInvocation
对象,把拦截器链、目标方法、目标对象等相关信息传入,调用proceed()
方法触发拦截器链的执行
proceed()
方法
获取拦截器对象执行invoke
方法
invoke方法里面有一个invocation
对象,它是一个ThreadLocal
类的对象,同一个线程共享数据,即把MethodInvocation
共享。这里的MethodInvocation
就是CglibMethodInvocation
共享CglibMethodInvocation
对象之后,会继续调用CglibMethodInvocation
的proceed
方法
索引自增,获取的第二个拦截器
每次执行proceed
方法,索引就会自增获取到下一个拦截器,然后拦截器又会调用invoke(this)
方法,进而调用CglibMethodInvocation
的proceed
方法,又可以获取到下一个拦截器,周而复始。
直到执行到最后一个拦截器
前置通知调用完成,进而调用目标方法
目标方法执行完成后,会返回到上一个的拦截器去执行对应的通知方法,然后继续返回到上一层
链式获取每一个拦截器,拦截器执行invoke
方法,每一个拦截器等待下一个拦截器执行完成返回以后再来执行米拦截器链的机制,保证通知方法与目标方法的执行顺序。