前提
Spring Aop 核心逻辑是AbstractAutoProxyCreator.
重点方法
postProcessBeforeInstantiation
遍历IOC容器所有BeanDefinition
查找是AspectJ 配置类的BeanDefinition。
缓存其的增强通知Advice。
postProcessAfterInitialization
检查是否需要为目标bean创建代理。
按target-proxy-class 配置创建代理。
流程图
执行代理方法流程
创建责任链为调用的方法。
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
创建MethodInvocation执行责任链。
MethodInvocation invocation =
new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
// Proceed to the joinpoint through the interceptor chain.
retVal = invocation.proceed();
重点相关类
MethodInvocation
类图
总结
MethodInvocation 实现了Joinpoint 接口。 proceed调用连接点方法。
接口MethodInterceptor
唯一方法invoke :理解成执行连接点(MethodInvocation)
Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;
ReflectiveMethodInvation
proxy
代理对象
target
目标对象
Method
执行的方法
arguments
方法参数
targetClass
目标类Class
interceptorAndDynamicMethodMatchers
切面通知调用链
执行流程具体逻辑
收集MethodInterceptor
执行责任链
若责任链执行结束,则调用连接点的方法。
源码
public Object proceed() throws Throwable {
// We start with an index of -1 and increment early.
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
return invokeJoinpoint();
}
Object interceptorOrInterceptionAdvice =
this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
}
}