AOP原理——3. AOP方法调用流程

本文详细介绍了AOP(面向切面编程)的方法调用流程,从获取拦截链到链式调用通知方法,重点解析了AOP如何通过内部类实现拦截器的顺序执行。通过对 和 的例子分析,展示了在 中,拦截方法中的语句如何在 前执行。文章还提及AOP采用适配器模式将Advice转换为MethodInterceptor,体现了设计的精妙之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 获取拦截链
  2. 链式调用通知方法

一般情况下是DynamicAdvisedInterceptor里的intercept方法起作用。
DynamicAdvisedInterceptorCglibAopProxy的内部类

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值