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.pswp.cn/diannao/85049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序32-简易双向数据绑定

在WXML中&#xff0c;普通属性的绑定是单向的&#xff0c;例如:<input value"{{value}}" /> 如果希望用户输入数据的同时改变data中的数据&#xff0c;可以借助简易双向绑定机制。在对应属性之前添加model:前缀即可: 例如<input model:value"{{value}…

Nginx网站服务:从入门到LNMP架构实战

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年5月30日14点22分 前言 说起Web服务器&#xff0c…

【maker-pdf 文档文字识别(包含ocr),安装使用完整教程】

安装环境 conda create -n maker-pdf python3.12 conda activate marker-pdf pip install modelscope pip install marker-pdf -U下载模型 from modelscope import snapshot_downloadmodel_root "models" snapshot_download("Lixiang/marker-pdf", loca…

C# 类和继承(所有类都派生自object类)

所有类都派生自object类 除了特殊的类object&#xff0c;所有的类都是派生类&#xff0c;即使它们没有基类规格说明。类object是唯 一的非派生类&#xff0c;因为它是继承层次结构的基础。 没有基类规格说明的类隐式地直接派生自类object。不加基类规格说明只是指定object为 基…

尚硅谷redis7 90-92 redis集群分片之集群扩容

90 redis集群分片之集群扩容 三主三从不够用了&#xff0c;进行扩容变为4主4从 问题&#xff1a;1.新建两个redis实例&#xff0c;怎么加入原有集群&#xff1f;2.原有的槽位分3段&#xff0c;又加进来一个槽位怎么算&#xff1f; 新建6387、6388两个服务实例配置文件新建后启…

尚硅谷-尚庭公寓部署文档

文章目录 整合版部署文档部署架构图1. 项目目录结构增加注释的 Dockerfile 配置(1) 后端服务1 Dockerfile (backend/service1/Dockerfile)(2) 后端服务2 Dockerfile (backend/service2/Dockerfile) Dockerfile 配置说明重要注意事项3. Nginx 配置(1) 主配置文件 (nginx/nginx.c…

Android Studio 介绍

如何关闭或彻底删除一个工程 基于Android Studio的android入门——如何关闭或彻底删除一个工程 搜索内容 Android Studio高效指南&#xff1a;快速查找技巧大揭秘 build命令&#xff1a;gradle app:assembleDebug 命令解析 1. 命令结构与作用 核心功能&#xff1a;该命令…

JAVA与C语言之间的差异(一)

一、代码习惯以及主函数 JAVA中{在使用的时候不要换行 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");}} 其次&#xff0c;以main函数为主函数&#xff1a; public …

华为OD机试真题——开放日活动/取出尽量少的球(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《开放…

我的3种AI写作节奏搭配模型,适合不同类型写作者

—不用内耗地高效写完一篇内容&#xff0c;原来可以这样搭配AI ✍️ 开场&#xff1a;为什么要“搭配节奏”写作&#xff1f; 很多人以为用AI写作&#xff0c;就是丢一句提示词&#xff0c;然后“等它写完”。 但你有没有遇到这些情况&#xff1a; AI写得很快&#xff0c;学境…

【知识点】第1章:程序设计基本方法

文章目录 知识点整理计算机的概念程序设计语言Python 语言概述Python 语言开发环境配置程序的基本编写方法 练习题简答题判断题 知识点整理 计算机的概念 计算机的定义&#xff1a;计算机是根据指令操作数据的设备。 计算机的两个基本特性&#xff1a; 功能性&#xff1a;计…

const ‘不可变’到底是值不变还是地址不变

const的基础规则 声明时必须初始化​ const a; // ❌ 报错&#xff1a;Missing initializer in const declaration const b 10; // ✅ 正确块级作用域​&#xff08;const 的作用域仅限于声明它的代码块&#xff09; if (true) {const x 100; } console.log(x); // ❌ 报错…

Netty 实战篇:为自研 RPC 框架加入异步调用与 Future 支持

我们在上篇实现了一个轻量级 RPC 框架&#xff0c;现在要进一步优化 —— 加入异步响应支持&#xff0c;让 RPC 通信变得真正高效、非阻塞、支持并发。 一、为什么需要异步调用&#xff1f; 上篇的 RPC 框架是“同步阻塞”的&#xff1a; 每次发送请求后&#xff0c;必须等待服…

for(auto a:b)和for(auto a:b)的区别

#include<iostream> using namespace std; int main() {string s( "hello world" );for (auto c:s)c t ;cout<<s<<endl; //结果为hello worldfor (auto &c:s)c t ;cout<<s<<endl; //结果为ttttttttttt }for(auto a:b)中b为一…

超级对话2:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之二

摘要&#xff1a;《人机协同文明升维行动框架》提出以HIAICI/W公式推动认知革命&#xff0c;构建三大落地场景&#xff1a;1&#xff09;低成本认知增强神经接口实现300%学习效率提升&#xff1b;2&#xff09;全球学科活动化闪电战快速转化知识体系&#xff1b;3&#xff09;人…

多方法解决MNIST数字识别

全连接层 import torch from torchvision import datasets, transforms import torch.nn as nn import torch.optim as optim from tqdm import tqdm # 用于进度条显示 import os# 定义数据预处理(标准化+Tensor转换) transform = transforms.Compose([transforms.ToTensor…

安装 Node.js 和配置 cnpm 镜像源

一、安装 Node.js 方式一&#xff1a;官网下载&#xff08;适合所有系统&#xff09; 访问 Node.js 官网 推荐选择 LTS&#xff08;长期支持&#xff09;版本&#xff0c;点击下载安装包。 根据系统提示一步步完成安装。 方式二&#xff1a;通过包管理器安装&#xff08;建…

vue 自定义组件的事件绑定

基本知识点 &#x1f3af;什么是自定义事件 自定义事件是子组件向父组件发送消息的机制&#xff0c;通常用于通知父组件发生了某些行为或状态变化。 &#x1f4cc; 基本语法 子组件触发事件&#xff08;$emit&#xff09; this.$emit(事件名, 参数);或在 const emit de…

进程同步机制-信号量机制-记录型信号量机制中的的wait和signal操作

wait和signal是记录型信号量机制中用于实现进程同步与互斥的两个重要操作&#xff0c; wait 操作 wait(semaphores *S) {S->value --;if (S->value<0) block(S->list) }请求资源&#xff1a;S->value --; 这一步表示进程请求一个单位的资源&#xff0c;将信号…

sd webui 安装sd-webui-TemporalKit 加载报错解决办法

ModuleNotFoundError: No module named moviepy.editer 报错内容类似上面截图&#xff0c;我的已经解决&#xff0c;暂时无法截图了 处理方法&#xff1a; 重点说明&#xff1a;插件目录必须是TemporalKit&#xff0c;不能更改 进入到安装目录&#xff1a;extensions\Tempor…