- 获取拦截链
- 链式调用通知方法
一般情况下是DynamicAdvisedInterceptor
里的intercept
方法起作用。
DynamicAdvisedInterceptor
是CglibAopProxy
的内部类
DynamicAdvisedInterceptor#intercept
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object oldProxy = null;
boolean setProxyContext = false;
Object target = null;
TargetSource targetSource = this.advised.getTargetSource();
try {
if (this.advised.exposeProxy) {
// Make invocation available if necessary.
oldProxy = AopContext.setCurrentProxy(proxy);
setProxyContext = true;
}
// Get as late as possible to minimize the time we "own" the target, in case it comes from a pool...
target = targetSource.getTarget();
Class<?> targetClass = (target != null ? target.getClass() : null);
// 1. 获取拦截链
// 这里获取到的拦截链是倒叙的,因为是递归调用链里通知方法(调用链里的第一个方法会回到该intercept方法),所以倒(链)倒(递归)为正。
// 这是一种很优秀的编程思想
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
Object retVal;
// Check whether we only have one InvokerInterceptor: that is,
// no real advice, but just reflective invocation of the target.
if (chain.isEmpty() && Modifier.isPublic(method.getModifiers(