当前位置: 首页 > 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 实现了 增强逻辑的统一管理、动态匹配与链式组合,是整个框架的重要基础构件。

相关文章:

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

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

【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

【HarmonyOS 5】鸿蒙中的UIAbility详解(二) 一、前言 今天我们继续深入讲解UIAbility,根据下图可知,在鸿蒙中UIAbility继承于Ability,开发者无法直接继承Ability。只能使用其两个子类:UIAbility和Extensi…...

力扣HOT100之动态规划:152. 乘积最大子数组

这道题并不是代码随想录里的,我试着用动规五部曲来做,然后不能通过全部测试样例,在第109个测试样例卡住了,如下所示。 原因是可能负数乘以负数会得到最大的乘积,不能单纯地用上一个序列的最大值乘以当前值来判断是否能…...

Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积

Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积 引言 在现代互联网大厂中,Java后端系统因为其复杂性和多样性,常常面临各种问题和挑战。从核心语言到微服务架构,从数据库到缓存,不同层…...

定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构

摘要:在数据驱动的数字营销时代,企业营销话语权正从传统媒体向掌握用户数据与技术的平台转移。本文基于“数据即权力”的核心逻辑,分析定制开发开源AI智能名片S2B2C商城小程序如何通过技术赋能、场景重构与生态协同,帮助企业重构营…...

【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)

目录 背景轨迹回放 - 匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 轨迹回放 - 非匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 背景 腾讯地图轨迹回放是匀速回放的,但是客户要求根据现实时间,什么时间点在某个点位 【腾讯地图轨…...

ffmpeg baidu

ffmpeg -list_devices true -f dshow -i dummy 获取你的音频输入设备(麦克风)名称 输出中可以看到你有如下两个可用麦克风设备: “麦克风阵列 (适用于数字麦克风的英特尔 智音技术)” “外部麦克风 (Realtek Audio)” (注意&…...

spring boot 拦截器HandlerInterceptor 不生效的原因排查

public class UserInterceptor implements HandlerInterceptor项目添加一个拦截器,发现未生效 1、排查拦截本身是否注入了springbean 容器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {2、排查springboot 项目扫描范围是否包含…...

公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?

在当今的网络时代,许多程序和服务都依赖于公网地址——用于标识设备在互联网位置的全球唯一标识符。例如,办公网站、FTP服务器或游戏服务器等需要借助公网IP来确保用户可以访问。故此准确获取公网IP地址显得尤为重要。 在大多家庭和企业网络中&#xff…...

将git最后一次提交把涉及到的文件按原来目录结构提取出来

文章目录 前言一、将git最后一次提交把涉及到的文件按原来目录结构提取出来 前言 将git最后一次的提交提取出来,涉及到的目录结构以及文件等,按原本的目录结构复制输出。并输出相关的补丁。 一、将git最后一次提交把涉及到的文件按原来目录结构提取出来…...

利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法

参阅:Top 创新大奖 这个课题将农业废弃物资源化利用、计算机辅助药物设计和绿色化学完美结合,是一个极具创新性和应用前景的研究方向! 以下是如何利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法的系统思路: 核心思路 玉…...

【Docker】存储卷

【简介】 宿主机的某一目录与容器中的某一目录建立的一种绑定关系,这就是“存储卷” 它有三个特性 1.它可以绕过联合文件系统, 直接作用于宿主机的目录 2.容器和宿主机的这一绑定关系指向了同一目录, 因此两个目录之间的数据是同步的&#xf…...

Python 爬虫工具 BeautifulSoup

文章目录 1. BeautifulSoup 概述1.1. 安装 2. 对象的种类2.1. BeautifulSoup2.2. NavigableString(字符串)2.3. Comment2.4. Tag2.4.1. 获取标签的名称2.4.2. 获取标签的属性2.4.3. 获取标签的内容2.4.3.1. tag.string2.4.3.2. tag.strings2.4.3.3. tag.…...

WPF的布局核心:网格布局(Grid)

网格布局(Grid) 1 行列定义(RowDefinitions & ColumnDefinitions)2 Grid.Row和Grid.Column3 跨行跨列(Grid.RowSpan & Grid.ColumnSpan)3.1垂直跨行3.2水平跨列3.3综合应用案例 4 高级布局技巧4.1共…...

OpenCV图像认知(二)

形态学变换: 核: 核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构,比如矩形结构、椭圆结构、十字形结构,如下图所示。通过不同的结构可以对不同特征的图像…...

大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 郑龙浩/仟墨 大数据与数据分析 文章目录 大数据与数据分析一 大数据是什么?1 定义2 大数据的来源3 大数据4个方面的典型特征(4V)4 大数据的应用领域5 数据分析工具6 数据是五种生产要素之一 二 …...

t015-预报名管理系统设计与实现 【含源码!!!】

项目演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装预报名管理系统软件来发挥其高效地信息处理的…...

LLM中的Loss与Logits详解

LLM中的Loss与Logits详解 自己构建的logits的损失函数,比自带loss效果好很多,建议自己构建; 另外学习率也是十分重要的参数,多次尝试,通过查看loss的下降趋势进行调整; 举例,来回跳跃说明下降率过大,一般从0.0001 开始尝试。 在深度学习中,logits 和 loss 是两个不…...

数学术语之源——绝对值(absolute value)(复数模?)

目录 1. 绝对值:(absolute value): 2. 复数尺度(复尺度):(modulus): 1. 绝对值:(absolute value): 一个实数的绝对值是其不考虑(irrespective)符号的大小(magnitude)。在拉丁语中具有相同意思的单词是“modulus”,这个单词还…...

亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)

一、数据爬取模块(Python示例) import requests from bs4 import BeautifulSoup import pandas as pd import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept-Language: en-US }def scrape_amazon_re…...

STM32的DMA入门指南:让单片机学会“自动搬运“数据

STM32的DMA入门指南:让单片机学会"自动搬运"数据 引言:CPU的烦恼 想象你是一个快递分拣员,每天要手动把成千上万的包裹从卡车搬到仓库。这时候如果有个自动传送带能帮你完成搬运工作,你就可以专心处理更重要的订单核对…...

从虚拟化到云原生与Serverless

操作系统课程:从虚拟化到云原生与Serverless 大家好,我是你们的操作系统课程老师!今天我们将从虚拟化技术讲到现代的云原生和Serverless架构,带你看看计算机系统如何从早期的虚拟机(VM)演进到容器&#xf…...

OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局

【AI安全警钟再响,这次主角竟是OpenAI?】 当全球AI圈还在为Claude 4的“乖巧”欢呼时,OpenAI最新模型o3却以一场惊心动魄的“叛逃”测试引爆舆论——在100次关机指令测试中,o3竟7次突破安全防护,甚至篡改底层代码阻止系…...

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…...

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中,技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者,我很荣幸能分享我们公司如何从产品的维度出发,精准把握市场需求,并不断推动产品的发展,以满足不断变化的行业…...

leetcode1201. 丑数 III -medium

1 题目:1201. 丑数 III. 官方标定难度:中 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。 示例 1: 输入:n 3, a 2, b 3, c 5 输出…...

ai工具集:AI材料星ppt生成,让你的演示更出彩

在当今快节奏的工作环境中,制作一份专业、美观的 PPT 是展示工作成果、传递信息的重要方式。与此同时,制作PPT简直各行各业的“职场噩梦”,很多人常常熬夜到凌晨3点才能完成,累到怀疑人生。 现在?完全不一样了&#x…...

@Prometheus 监控操作系统-Exporter(Win Linux)

文章目录 Prometheus 监控操作系统(Win&Linux)-Exporter1. 概述2. Linux 系统监控 (Node Exporter)2.1 下载 Node Exporter2.2 创建 Systemd 服务2.3 启动服务2.4 验证安装 3. Windows 系统监控 (Windows Exporter)3.1 下载 Windows Exporter3.2 安装选项3.3 验证安装3.4 防…...

LINUX530 rsync定时同步 环境配置

rsync定时代码同步 环境配置 关闭防火墙 selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config SELINUXdisable设置主机名 hostnamectl set-hostname code hostnamectl set-hostname backup设置静态地址 cd /etc/sysconfi…...

CMG 机器人格斗大赛举行,宇树人形机器人参赛,比赛有哪些看点?对行业意味着什么?

点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 其实那个遥控员挺爽的。打拳皇等都是用手柄控制虚拟人物在对打,他们这是控制真的。 格斗最考验的不是攻击力,而是"挨打后能不能快速爬起来"。G1在比赛中展示…...