这里假设是jdk的动态代理,代理对象的目标方法执行的时候会先执行invoke方法,
在invoke方法内部调用AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice获取到所有和这个被调用的方法匹配的advice对象,返回值类型是一个list集合,如果返回的集合是空的,说明目标方法没有被aop增强(因为不是所有的类都需要被拦截增强的),就直接反射调用即可.
如果返回值不是空的,说明有方法被拦截,就实例化ReflectiveMethodInvocation对象(ReflectiveMethodInvocation对象里面包含了当前目标方法,代理对象,参数,类,调用链等信息).
然后invoke调用intercept.Joinpoint#proceed,在proceed方法内部就会形成一个链式调用.interceptorsAndDynamicMethodMatchers就是增强链,先判断如果interceptorsAndDynamicMethodMatchers-1等于currentInterceptorIndex(currentInterceptorIndex的初始值为-1)的话就是目标方法,就直接反射调用即可,,就是增强方法,比如前置方法后置方法等等,就调用MethodInterceptor#invoke去执行.执行完了currentInterceptorIndex加1.(interceptorsAndDynamicMethodMatchers是这个方法的增强通知,有一个增强通知这个长度就加1,如果为0说明这个目标方法没有增强通知).
说白了就是AOP是利用interceptorsAndDynamicMethodMatchers的索引来控制调用那个切面增加方法.
如果是调用后置的方法的话会先调用AspectJAfterAdvice#invoke,在这个方法内部会调用Joinpoint#proceed执行前置通知,然后在finally代码块儿里面调用后置方法.