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

Spring Advisor增强规则实现原理介绍

Spring Advisor增强规则实现原理介绍

    • 一、什么是 Advisor?
      • 1. Advisor 的定义与本质
        • 接口定义:
      • 2. Advisor 的核心作用
        • 统一封装切点与通知
        • 构建拦截器链的基础
        • 实现增强逻辑的灵活组合
    • 二. Sprin当中的实现逻辑
        • 1 `Advisor` 接口定义
        • 2 `PointcutAdvisor` 接口定义
        • 3 `AspectJExpressionPointcutAdvisor` 实现类

源码见:mini-spring

在这里插入图片描述

一、什么是 Advisor?

参考:AOP相关核心概念与作用说明(补充)

1. Advisor 的定义与本质

Advisor(顾问)是 Spring AOP 提供的一个接口,用于封装以下两部分内容:

  • Advice:增强逻辑,即实际执行的横切代码。

  • Pointcut:切点逻辑,定义增强逻辑在哪些连接点(方法)生效。

通俗来说,Advisor = Advice + Pointcut

这种设计让 Spring AOP 框架可以通过统一的方式处理各种通知类型(如前置、后置、环绕等)。

接口定义:
public interface Advisor {Advice getAdvice();
}

当一个 Advisor 同时包含切点信息时,会实现其子接口 PointcutAdvisor

public interface PointcutAdvisor extends Advisor {Pointcut getPointcut(); // 获取切点定义
}

2. Advisor 的核心作用

统一封装切点与通知

在 Spring AOP 中,大量组件实现了 Advisor 接口。通过这一统一抽象,框架无需区分通知类型(如 BeforeAdvice / AfterAdvice),可以统一处理逻辑。

构建拦截器链的基础

Spring AOP 在执行代理方法时会构建一个拦截器链(interceptor chain),每个 Advisor 都会被包装为 MethodInterceptor 插入到链中。只有切点匹配的 Advisor 才会生效。

实现增强逻辑的灵活组合

多个 Advisor 可以作用于同一个目标类,实现增强逻辑的灵活组合和动态添加,具有良好的扩展性和可插拔性。

简而言之,Advisor 就是 Spring AOP 中的“顾问”,它告诉框架:
在哪些地方执行什么增强逻辑


二. Sprin当中的实现逻辑

1 Advisor 接口定义
/*** 顾问接口:封装一个 Advice(通知逻辑)* 不关注切点,适用于全局增强逻辑* * @author jixu* @date 2025/5/27*/
public interface Advisor {/*** 获取通知逻辑对象*/Advice getAdvice();
}

2 PointcutAdvisor 接口定义
/*** 切点顾问接口:封装 Advice + Pointcut* 常用于需要指定增强位置的通知(如方法级别拦截)* * @author jixu* @date 2025/5/27*/
public interface PointcutAdvisor extends Advisor {/*** 获取切点定义*/PointCut getPointcut();
}

3 AspectJExpressionPointcutAdvisor 实现类
/*** 基于 AspectJ 表达式的切点顾问实现* 封装了一个切点表达式(Pointcut)和对应的通知(Advice)* * 用于将 Pointcut + Advice 组合成统一 Advisor 结构* * @author jixu* @date 2025/5/27*/
public class AspectJExpressionPointcutAdvisor implements PointcutAdvisor {private Advice advice;            // 通知逻辑private PointCut pointcut;        // 切点对象private String expression;        // 切点表达式public AspectJExpressionPointcutAdvisor() {}@Overridepublic PointCut getPointcut() {if (this.pointcut == null) {this.pointcut = new AspectJExpressionPointcut(expression);}return this.pointcut;}@Overridepublic Advice getAdvice() {return this.advice;}public void setAdvice(Advice advice) {this.advice = advice;}public void setExpression(String expression) {this.expression = expression;}
}
组件作用
Advice具体的增强逻辑,如日志打印、事务控制
Pointcut定义哪些连接点需要增强
Advisor封装 Advice 和 Pointcut,统一 AOP 调度入口
PointcutAdvisor可匹配特定方法的 Advisor
AspectJExpressionPointcutAdvisor结合 AspectJ 表达式生成动态切点

通过将 Advice 与 Pointcut 封装为 Advisor,Spring AOP 实现了 增强逻辑的统一管理、动态匹配与链式组合,是整个框架的重要基础构件。

http://www.lryc.cn/news/2393995.html

相关文章:

  • 【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
  • 力扣HOT100之动态规划:152. 乘积最大子数组
  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构
  • 【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)
  • ffmpeg baidu
  • spring boot 拦截器HandlerInterceptor 不生效的原因排查
  • 公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?
  • 将git最后一次提交把涉及到的文件按原来目录结构提取出来
  • 利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法
  • 【Docker】存储卷
  • Python 爬虫工具 BeautifulSoup
  • WPF的布局核心:网格布局(Grid)
  • OpenCV图像认知(二)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • t015-预报名管理系统设计与实现 【含源码!!!】
  • LLM中的Loss与Logits详解
  • 数学术语之源——绝对值(absolute value)(复数模?)
  • 亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)
  • STM32的DMA入门指南:让单片机学会“自动搬运“数据
  • 从虚拟化到云原生与Serverless
  • OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局
  • Bootstrap:精通级教程(VIP10万字版)
  • 技术创新如何赋能音视频直播行业?
  • leetcode1201. 丑数 III -medium
  • ai工具集:AI材料星ppt生成,让你的演示更出彩
  • @Prometheus 监控操作系统-Exporter(Win Linux)
  • LINUX530 rsync定时同步 环境配置
  • CMG 机器人格斗大赛举行,宇树人形机器人参赛,比赛有哪些看点?对行业意味着什么?
  • Python——MySQL远程控制