Spring的aop源码分析之JDK动态代理执行源码

本文深入分析了Spring AOP在使用JDK动态代理时的执行过程,从`invoke`方法开始,详细讲解了代理对象执行、责任链构建(`getInterceptorsAndDynamicInterceptionAdvice`方法)以及调用责任链(`proceed`方法)的步骤。重点在于理解拦截器的构建与执行以及目标方法的调用流程。
摘要由CSDN通过智能技术生成

        之前的文章中我们详解的介绍了Spring aop创建代理的源码分析,具体的内容可以去翻一下我之前的文章Spring的aop源码分析,aop创建代理对象的过程我们知道,那么在执行的过程中又会发生什么样的事情呢,我们今天就来一探究竟。

我们知道JDK动态代理中,有两个主要的方法:

  • 实现InvocationHandler接口,实现其invoke方法,调用方法时进行增强。
  • 实现AopProxy接口,实现其getProxy方法,生成接口的代理对象。

一、代理对象执行的过程

1.1、invoke

因此,我们要追踪aop代理对象执行的过程首先要从JdkDynamicAopProxyinvoke方法开始,其源码如下:

	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(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值