当前位置: 首页 > news >正文

spring代理和切面

今天在deepseek上偶然问了这个问题,给出的描述很清楚,抄下来。

拦截器链执行核心

public class ReflectiveMethodInvocation implements MethodInvocation {private final Object target;private final Method method;private final Object[] args;private final List<MethodInterceptor> interceptors;// 关键:当前拦截器索引,记录执行位置private int currentInterceptorIndex = -1;public ReflectiveMethodInvocation(Object target, Method method, Object[] args, List<MethodInterceptor> interceptors) {this.target = target;this.method = method;this.args = args;this.interceptors = interceptors;}@Overridepublic Object proceed() throws Throwable {// 所有拦截器都执行完毕,执行原始目标方法if (currentInterceptorIndex == interceptors.size() - 1) {return method.invoke(target, args);}// 获取下一个拦截器并执行MethodInterceptor interceptor = interceptors.get(++currentInterceptorIndex);return interceptor.invoke(this); // 关键:递归调用链
    }
}

里面的invoke代码不难,类似这样:

    @Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {// 先执行前置逻辑
        beforeAdvice.run();// 继续执行链return invocation.proceed();}

所以proceed差不多可以简化成这样:

    @Overridepublic Object proceed() throws Throwable {// 所有拦截器都执行完毕,执行原始目标方法if (currentInterceptorIndex == interceptors.size() - 1) {return method.invoke(target, args);}// 获取下一个拦截器并执行MethodInterceptor interceptor = interceptors.get(++currentInterceptorIndex);return proceed();}

spring把controller里我们实现的method用一个结构体(class)描述出来,调用的method名字,参数,包括外面用aspect做的切面都塞到结构体里。叫做ReflectiveMethodInvocation。按我的习惯就叫execution。proceed()是一个递归函数,它总是执行下一个切面,除非没有切面了,再执行真正的用户方法。

注意method本体的调用是在else里的,一个切面如果进入另一个切面,它就不执行method了。所以只有咀内层(最末序)的切面有调用method的机会,如果它也没调用,那这个controller的方法就被绕过了。

没接触spring的时候,猜测切面应该就是钩子吧,其实是比钩子高级的钩子,重要的是它把方法调用描述成数据结构,然后再“手动”调用,这样对方法所处的执行点位的执行流和执行内容能全权控制。

http://www.jsqmd.com/news/31751/

相关文章:

  • 2025年评价高的垃圾桶厨房收纳最新用户好评榜
  • VisionPro学习笔记-工具栏菜单
  • minio 集群部署磁盘挂载一些问题
  • P12028 [USACO25OPEN] Moo Decomposition G
  • P7371 [COCI 2018/2019 #4] Kisik 题解
  • C# 状态机
  • PHP 现代特性速查 写出更简洁安全的代码(中篇)
  • 真 CSP 2025 游记
  • [引]Regenerate the SAS key used in HTTP trigger flows
  • AI元人文:大语言模型与价值权衡的共生之道
  • 11月4号
  • AVrecon僵尸网络感染超7万台Linux路由器,潜伏两年终被发现
  • AI元人文:化解算力质疑——降维重构价值计算
  • Gunicorn 基础使用
  • [UNIX] unix classic book
  • [UNIX]A Quarter Century of Unix by Peter H. Salus
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆会所美容院,商用家用极寒地区全热交换系统公司推荐!
  • 2025 年 11 月新风系统厂家权威推荐榜:电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆会所美容院商用家用全热交换系统精选
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆会所美容院,商用家用极寒地区全热交换新风系统公司推荐
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆艾灸会所美容院商用家用全热交换极寒地区公司推荐
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆会所美容院,商用家用极寒地区全热交换系统公司精选
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞/网咖/酒店/棋牌室/KTV/洗浴/商场/办公室/别墅/学校/诊所/中医馆/会所/美容院/商用/家用/极寒地区/全热交换新风系统公司推荐
  • 2025 年 11 月新风系统厂家推荐排行榜,电竞网咖酒店棋牌室KTV洗浴饭店商场办公室别墅大宅学校诊所中医馆会所美容院,商用家用全热交换极寒地区适用
  • Glide将网络图片压缩成指定大小并保存到本地
  • 认知过程的现象学模型:回到“事情本身”的意识体验
  • AI元人文构想中的“内观照叙事模型”:从心灵哲学到价值计算的桥梁
  • C# DataGridView 大数据量性能优化 - 尼古拉
  • WPF的更新通知
  • [数据仓库] 腾讯数据仓库规范体系 [转]
  • 20251104 之所思 - 人生如梦