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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85049.shtml
英文地址,請注明出處:http://en.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…