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

wordpress 上传 重命名郑州seo外包平台

wordpress 上传 重命名,郑州seo外包平台,做网站使用什么软件的,常州模板建站代理⚙️ 一、通知到 MethodInterceptor 的转换机制 Spring AOP 通过适配器模式将开发者定义的注解型通知(如 Before)统一转换为 MethodInterceptor 接口实现,确保所有通知类型能接入同一调用链。以下是转换细节: 1. 适配器实现原理 核…

⚙️ 一、通知到 MethodInterceptor 的转换机制

Spring AOP 通过适配器模式将开发者定义的注解型通知(如 @Before)统一转换为 MethodInterceptor 接口实现,确保所有通知类型能接入同一调用链。以下是转换细节:

1. 适配器实现原理

  • 核心接口:MethodInterceptor是所有通知的最终形态,其invoke(MethodInvocation mi)方法封装了通知逻辑与链式调用逻辑。
  • 适配器作用:将不同通知类型(如AspectJMethodBeforeAdvice)包装为MethodInterceptor子类,实现逻辑转换。

2. 各通知类型的转换细节

下表总结了五种通知的转换逻辑与执行顺序:

通知类型原始接口转换后实现invoke() 核心逻辑
@BeforeAspectJMethodBeforeAdviceMethodBeforeAdviceInterceptor1. 执行 advice.before()
2. 调用 mi.proceed() 触发后续链
@AfterAspectJAfterAdviceAfterAdviceInterceptor1. try { mi.proceed() }
2. finally { advice.after() }(确保最终执行)
@AfterReturningAspectJAfterReturningAdviceAfterReturningAdviceInterceptor1. 调用 mi.proceed()
2. 若正常返回,执行 advice.afterReturning()
@AfterThrowingAspectJAfterThrowingAdviceThrowsAdviceInterceptor1. try { mi.proceed() }
2. catch(ex) { advice.afterThrowing(ex) }
@AroundAspectJAroundAdvice1. 自定义前后逻辑
2. 通过 mi.proceed() 触发后续链(需主动调用)

关键设计:除 @Around 外,所有通知均被转换为环绕通知形式,通过统一的 invoke() 接口接入调用链。


🔄 二、MethodInvocation 与拦截器链的协同流程

1. 调用链构建过程

  1. 代理对象创建:Spring 容器启动时,扫描所有Advisor(包含通知与切点)。
  2. 适配器转换:通过AdvisorAdapterRegistryAdvisor中的通知转换为MethodInterceptor
  3. 链式存储:生成List<MethodInterceptor>并注入ReflectiveMethodInvocation

2. 调用链执行逻辑(ReflectiveMethodInvocation.proceed()

public class ReflectiveMethodInvocation implements MethodInvocation {private final List<MethodInterceptor> interceptors;private int currentInterceptorIndex = -1;  // 当前执行位置索引public Object proceed() throws Throwable {// 1. 所有拦截器执行完毕 → 反射调用目标方法if (this.currentInterceptorIndex == interceptors.size() - 1) {return invokeJoinpoint(); }// 2. 获取下一个拦截器并推进索引MethodInterceptor interceptor = interceptors.get(++currentInterceptorIndex);// 3. 执行当前拦截器(触发统一的invoke接口)return interceptor.invoke(this);  // 将自身(MethodInvocation)传入}
}

索引机制currentInterceptorIndex 记录当前执行位置,每次 proceed() 调用时递增,实现拦截器的顺序触发。

3. 各通知在调用链中的协作顺序

以下序列图展示了典型调用流程(含多个通知类型):

ReflectiveMethodInvocationBefore拦截器Around拦截器After拦截器目标方法interceptor.invoke(this)1执行@Before逻辑2调用proceed()3interceptor.invoke(this)4环绕前逻辑5调用proceed()6interceptor.invoke(this)7调用proceed()8反射调用目标方法9返回结果10执行@After逻辑11返回12环绕后逻辑13返回14返回最终结果15ReflectiveMethodInvocationBefore拦截器Around拦截器After拦截器目标方法

协作关键

  • 嵌套执行:每个拦截器通过调用mi.proceed()触发后续拦截器或目标方法,形成嵌套调用栈。
  • 逻辑控制权:拦截器可决定是否调用proceed()。例如权限校验失败时,Before拦截器可不调用proceed(),直接中断链。

🧩 三、统一 MethodInterceptor 的设计价值

1. 外部易用性

开发者通过直观注解(如 @Before)声明切面,无需理解底层调用链。适配器模式隐藏了复杂性,例如:

@Before("execution(* com.dwl.*.*(..))")
public void logBefore(JoinPoint jp) {System.out.println("Before: " + jp.getSignature());
}

2. 内部统一性

  • 单一执行逻辑:ReflectiveMethodInvocation.proceed()只需遍历List<MethodInterceptor>,无需区分通知类型。
  • 扩展性:新增通知类型时,只需实现适配器并注册到AdvisorAdapterRegistry,无需修改调用链核心逻辑。

3. 异常处理优势

  • 统一异常传播:异常沿调用链反向传递,由最近的@AfterThrowing@Around拦截器捕获。
  • 资源清理保证:@After逻辑在finally块执行,确保即使目标方法异常也能运行(如关闭数据库连接)。

⚡ 四、完整流程案例:日志切面执行

假设切面包含 @Before@Around@After 通知,调用链构建与执行如下:

  1. 转换阶段

    • @BeforeMethodBeforeAdviceInterceptor
    • @AroundAspectJAroundAdvice
    • @AfterAfterAdviceInterceptor
  2. 调用链执行顺序

    调用proceed
    调用proceed
    调用proceed
    返回
    执行finally逻辑
    执行环绕后逻辑
    Before拦截器
    Around拦截器
    After拦截器
    目标方法
  3. 异常场景:若目标方法抛出异常:

    • After 拦截器在 finally 中执行日志清理。
    • 异常传递给Around拦截器,由其捕获并记录。

💎 总结

  1. 转换必然性:适配器模式是 Spring AOP 的基石,将注解通知统一转为MethodInterceptor,实现调用链标准化。
  2. 协同核心:ReflectiveMethodInvocation通过索引控制与嵌套调用(proceed())协调拦截器执行,形成责任链模式。
  3. 设计价值:
    • 对外:简化开发,通过注解屏蔽底层复杂度。
    • 对内:通过统一接口减少冗余代码,提升扩展性。
    • 健壮性:异常处理与资源清理机制保障业务逻辑安全。

此设计完美体现了 “开闭原则”:新增通知类型无需修改调用链核心,仅需扩展适配器。

http://www.dtcms.com/a/399500.html

相关文章:

  • 【C++实战㊱】解锁C++依赖倒置:从理论到实战的蜕变之旅
  • 项目案例作业2:对案例进行面向对象分析
  • 锤子助手插件功能七十二:对话内图片「一键添加至表情」
  • 饮食网站开发需求网站开发 面试
  • Deepseek本地部署教程模型怎么选择?按需选择让效率翻倍
  • 企业备案网站服务内容wordpress ajax搜索
  • 自己做网站不推广备案可以不关闭网站吗
  • 12_OkHttp初体验
  • 硅基计划5.0 MySQL 壹 初识MySQL
  • 网站规划建设方案免费微信点餐小程序
  • Ford-Fulkerson最大流算法数学原理详解
  • 湛江做寄生虫网站wordpress修改端口
  • 从技术角度分析 “诺亚参数” 生成式设计工具
  • 做pc端网站代理商广告传媒网站模板
  • All In AI之三:一文构建Python核心语法体系
  • 湖州公司做网站南山龙岗最新通告
  • 南通建设招聘信息网站石家庄网站建设服务
  • 网站配资公司网站网站推荐免费的
  • asp旅游网站模板下载阜新本地网站建设平台
  • DBA 系统学习计划(从入门到进阶)
  • 列出网站目录wordpress正文底部版权声明
  • 网站改版建设 有哪些内容什么叫关键词
  • 郴州网站建设设计制作西安开发网站建设
  • 深度解析:vLLM PD分离KV cache传递机制全解析
  • 六维力传感器和关节扭矩传感器:机器人精准控制的“内外双核”
  • 什么是TCP/UDP/HTTP?它们如何影响你的内网穿透体验?
  • 如何制作大气网站公司变更流程
  • docker概念、安装与基本使用
  • 文件操作的相关知识
  • 网站建设不足之处网站seo案例