之前的文章中我们详解的介绍了Spring aop创建代理的源码分析,具体的内容可以去翻一下我之前的文章Spring的aop源码分析,aop创建代理对象的过程我们知道,那么在执行的过程中又会发生什么样的事情呢,我们今天就来一探究竟。
我们知道JDK动态代理中,有两个主要的方法:
- 实现InvocationHandler接口,实现其invoke方法,调用方法时进行增强。
- 实现AopProxy接口,实现其getProxy方法,生成接口的代理对象。
一、代理对象执行的过程
1.1、invoke
因此,我们要追踪aop代理对象执行的过程首先要从JdkDynamicAopProxy的invoke方法开始,其源码如下:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MethodInvocation invocation;
//一堆判断和加载,拖到最下面,看责任链部分,核心在那里。
Object oldProxy = null;
boolean setProxyContext = false;
//获取目标资源,此处就是slaverImpl,debug变量值试试
TargetSource targetSource = this.advised.targetSource;
Object target = null;
try {
//下面一顿if判断,实际和业务并没有什么关系,可以直接跳过
//当前方法是否等于Equals,如果是,则重写
if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) {
return equals(args[0]);
//当前方法是否等于HashCode,如果是,则重写
} else if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) {
return hashCode();
//方法声明类是否等于DecoratingProxy
} else if (method.getDeclaringClass() == DecoratingProxy.class) {
//使用反射直接进行调用目标资源
return AopProxyUtils.ultimateTargetClass(this.advised);
//方法声明是否接口 、或者是否Advised类型
} else if (!this.advised.opaque && method.getDeclaringClass().isInterface() &&
method.getDeclaringClass().isAssignableFrom(Advised.class)) {
// 用代理配置对ProxyConfig进行服务调用。。。
return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
}
Object retVal;
//如果暴露;就放到ThreadLocal,默认不暴露,不重要,不管他
if (this.advised.exposeProxy) {
// 有时候会出现目标对象内部方法间自调用,这时无法实施切面中的增强
// 需要通过设置currentProxy属性暴露代理
// 放到ThreadLocal
oldProxy = AopContext.setCurrentProxy(