Spring原理揭秘--初識AOP

我們知道軟件開發一直在追求高效,易維護,易擴展的特性方式。在面向過程編程到面向對象編程的歷程中,程序的開發有了非常大的進步。但是oop的方式缺依然存在著一些缺點。oop的方式可以將業務進行很好的分解和封裝使其模塊化,但是卻沒辦法更好的避免類似于系統需求的視線在系統中各處散落這樣的問題。比如:不同的主業務可能都會需要一些與業務無關的邏輯代碼--日志記錄,事務處理等。那么這些相同的無關邏輯在不同業務中的對應關系則會變成1:n的方式。這樣就會造成后續維護的成本賊高。因此推出了AOP的方式來對oop的缺點進行優化。

AOP被稱為面向方面編程或者切面編程。相當于一個刀直接在業務邏輯上橫切。只需要實現AOP的邏輯即可插入到任何的業務邏輯中去從而只需要維護AOP邏輯即可管理所有的非業務邏輯。AOP和OOP是互補的方式而不是競爭的方式。

Java平臺上的AOP實現機制

而在java平臺上實現AOP的方式有以下幾種

動態代理:

JDK1.3之后引入了動態代理的機制,可以在運行期間,為相應的接口動態生成代理對象。所以,我們可以將橫切關注點邏輯封裝到動態代理的InvocationHandler當中,然后在運行期間通過動態代理生成對應對象的子類將橫切邏輯織入到代理對象當中。這種方式相比于靜態代理則是性能稍微遜色一些。同時有一個缺點就是只能實現接口的動態代理,那些沒有接口實現的類則無法實現動態代理

動態字節碼增強:

java虛擬機加載的class文件都是符合一定的規范的,所以只要交給java虛擬機運行的class文件符合java class規范那么程序運行就沒有什么問題。而通常情況下class文件是通過java編譯期編譯而形成的。而java則推出了CGLIB的方式等java工具庫,在運行期間通過修改字節碼的方式來實現動態增強,將新增的業務邏輯加入到AOP邏輯當中。CJLIB的方式則不需要java類去繼承接口,只需要java類能夠生成子類即可就能實現動態字節碼增強

AOP的各個組件

Joinpoint:

在系統運行之前,aop的功能就需要織入到OOP當中,所以這個注入的過程我們需要知道在OOP代碼中哪些執行點上進行織入操作,這些將要在其之上進行織入操作的系統執行點就是Joinpoint

比如上述的代碼執行流程圖當中我們可以在以下階段進行織入:

方法調用:當某個方法被調用的時候所處的程序執行點,圖中的三個圓圈則是屬于這種類型。

方法調用執行:這種方式的本質是在執行,也就是在方法體內執行的時候才會調用。與方法調用的區別在于一般方法調用先執行而方法調用執行后執行

構造方法調用:與方法調用意思幾乎相同,在構造方法進行初始化的時候進行執行

構造方法調用執行:則是在執行構造方法的時候才會真正的執行

字段設置:在設置某個屬性通過setter方法被設置或者直接被設置的時點。該Joinpoint的本質是對象屬性被設置時候觸發

字段獲取:在獲取相對字段的時候也就是通過getter方法訪問或者直接訪問的時候則會觸發

異常處理執行:當出現異常的時候,則會在對應的異常拋出點執行

類初始化:類初始化則是類中某些靜態類型或者靜態代碼塊初始化的時間點上的時候會執行

基本上在代碼執行的過程中所有的執行時點上都可以作為Joinpoint,那么這些joinpoint有了如果我們僅僅在需要的地方執行如何告訴程序呢?

Poincut

Poincut則是告訴程序需要在哪些Joinpoint上去執行AOP邏輯處理,如果說Joinpoint是所有的可執行點,那么Poincut則是真正需要執行AOP的執行點。

在 Spring AOP 中,Pointcut 主要通過以下方式實現:

1.?基于注解的 Pointcut

使用?@Pointcut?注解定義切入點表達式,常見的表達式類型包括:

  • execution:匹配方法執行連接點。
  • within:匹配指定類型內的方法。
  • @annotation:匹配帶有特定注解的方法。

2.?execution 表達式

最常用的表達式類型,語法為:

execution(修飾符? 返回類型 類路徑?方法名(參數) throws 異常?)

2.?其他表達式類型

  • within:限制匹配范圍為特定類型。

// 匹配 UserService 類中的所有方法
within(com.example.service.UserService)// 匹配 service 包下的所有類的方法
within(com.example.service.*)// 匹配 service 包及其子包下的所有類的方法
within(com.example.service..*)
  • @annotation:匹配帶有特定注解的方法。

// 匹配所有帶 @Loggable 注解的方法
@annotation(com.example.annotation.Loggable)

2.?基于 XML 配置的 Pointcut

在 Spring XML 配置中,可以使用?<aop:pointcut>?元素定義切入點

Pointcut 本身只是定義篩選條件,需要與通知(Advice)?結合才能實現 AOP 的增強功能

💡?黃金法則
Pointcut = 在哪里切(Where) + 切什么(What)
好的切點表達式應該像精準的手術刀,而非大錘。

Adivce

Advice(通知)?是核心概念之一,用于定義在目標方法執行的特定時機插入的橫切邏輯(如日志、事務、權限校驗等)。它決定了切面(Aspect)行為的具體執行位置和內容。

以下是Spring AOP支持的Advice類型及其執行時機:

通知類型注解執行時機
Before Advice@Before在目標方法執行前觸發(例如:權限校驗)
After Returning@AfterReturning在目標方法成功返回后觸發(例如:記錄操作結果)
After Throwing@AfterThrowing在目標方法拋出異常后觸發(例如:異常日志記錄)
After (Finally)@After在目標方法結束后觸發(無論成功/異常,類似finally塊,例如:資源清理)
Around Advice@Around環繞目標方法執行,可控制方法調用、修改參數/返回值(例如:性能監控、事務管理)

Advice 是 Spring AOP 實現橫切邏輯的核心機制,通過五種類型覆蓋方法執行的各個生命周期節點,顯著提升代碼復用性和可維護性。正確使用Advice能高效解決日志、事務、安全等橫切關注點問題,是Spring生態中不可或缺的組件。

織入和織入器

織入?是指將?切面(Aspect)?中定義的橫切邏輯(Advice)動態植入到目標對象(Target Object)?的過程。類比織布,就是將切面的"線"編織到業務邏輯的"布料"中。

關鍵作用:

  1. 動態增強目標對象
    在目標方法執行的特定位置(如方法調用前、返回后、異常時)插入橫切邏輯(如日志、事務等)。

  2. 實現邏輯解耦
    將核心業務邏輯(如用戶服務)與非功能性需求(如日志記錄)分離,通過織入機制在運行時組合。

  3. 支持多種植入方式

織入時機實現方式特點
編譯時織入使用 AspectJ 編譯器性能高,但需要特殊編譯步驟(如 Maven 插件)
類加載時織入通過 Java Agent(LTW)無需修改源碼,在 JVM 加載類時植入(Spring 支持)
運行時織入Spring AOP 默認方式(動態代理)無需編譯支持,但僅作用于 Spring 容器管理的 Bean(最常用)

織入器?是負責執行織入操作的底層引擎。在 Spring AOP 中,織入器由框架內部實現,開發者通過配置驅動其工作。

核心職責:
  1. 解析切面配置
    讀取?@Aspect?注解或 XML 配置,識別 Pointcut(切入點)和 Advice(通知)的定義。

  2. 匹配連接點(Join Point)
    根據 Pointcut 表達式(如?execution(* com.service.*.*(..)))定位需要增強的目標方法。

  3. 生成代理對象

    代理類型觸發條件實現方式
    JDK 動態代理目標類實現了接口基于?java.lang.reflect.Proxy
    CGLIB 代理目標類未實現接口(或強制使用)通過字節碼生成子類(如?UserService$$EnhancerBySpringCGLIB
  4. 植入 Advice 邏輯
    在代理對象中按順序集成各類通知(如?@Before@Around),構建執行鏈。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88984.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Provider模式:軟件架構中的“供應商“設計哲學

文章目錄Provider模式&#xff1a;軟件架構中的“供應商“設計哲學什么是Provider模式&#xff1f;經典應用場景1. 配置管理Provider2. 數據訪問Provider4. 消息隊列ProviderProvider模式的優勢1. 解耦合實際項目中的應用Provider模式的最佳實踐1. 命名約定2. 接口設計原則3. 錯…

LTspic下載,幫助及演示電路

1.下載 LTspice是一款強大高效的免費SPICE仿真器軟件、原理圖采集和波形觀測器&#xff0c;為改善模擬電路的仿真提供增強功能和模型。其原理圖捕獲圖形界面使您能夠探測原理圖并生成仿真結果&#xff0c;這些結果可以通過內置波形查看器進一步觀察分析。 鏈接&#xff1a; …

位置編碼/絕對位置編碼/相對位置編碼/Rope原理+公式詳細推導及代碼實現

文章目錄1. 位置編碼概述1.1 為什么需要位置編碼&#xff1f;2. 絕對位置編碼 (Absolute Position Encoding)2.1 原理2.2 數學公式2.3 代碼實現2.4 代碼與公式的對應關系2.5 特性與優勢2.6 可學習的絕對位置編碼3. 相對位置編碼 (Relative Position Encoding)3.1 原理3.2 數學公…

網絡安全初級第一次作業

一&#xff0c;docker搭建和掛載vpm 1.安裝 Docker apt-get install docker.io docker-compose 2.創建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改寫文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…

交換類排序的C語言實現

交換類排序包括冒泡排序和快速排序兩種。冒泡排序基本介紹冒泡排序是通過重復比較相鄰元素并交換位置實現排序。其核心思想是每一輪遍歷將未排序序列中的最大&#xff08;或最小&#xff09;元素"浮動"到正確位置&#xff0c;類似氣泡上升。基本過程是從序列起始位置…

嵌入式 Linux開發環境構建之Source Insight 的安裝和使用

目錄 一、Source Insight 的安裝 二、Source Insight 使用 一、Source Insight 的安裝 這個軟件是代碼編輯和查看軟件&#xff0c;打開開發板光盤軟件&#xff0c;然后右鍵選擇以管理員身份運行這個安裝包。在彈出來的安裝向導里面點擊 next &#xff0c;如下圖所示。這里選擇…

【字節跳動】數據挖掘面試題0016:解釋AUC的定義,它解決了什么問題,優缺點是什么,并說出工業界如何計算AUC。

文章大綱 AUC(Area Under the Curve)詳解一、定義:AUC是什么?二、解決了什么問題?三、優缺點分析四、工業界大規模計算AUC的方法1. 標準計算(小數據)2. 工業級大規模計算方案3.工業界最佳實踐4.工業界方案選型建議總結:AUC的本質AUC(Area Under the Curve)詳解 一、…

Python后端項目之:我為什么使用pdm+uv

在試用了一段時間的uv和pdm之后&#xff0c;上個月(2025.06)開始&#xff0c;逐步把用了幾年的poetry替換成了pdmuv&#xff08;pipx install pdm uv && pdm config use_uv true) ## 為什么poetry -> pdm: 1. 通過ssh連接到服務器并使用poetry shell激活虛擬環境之…

鴻蒙Next開發,配置Navigation的Route

1. 通過router_map.json配置文件進行 創建頁面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上創建私有倉庫

一、在 GitHub 上創建私有倉庫打開 GitHub官網 并登錄。點擊右上角的 “” → 選擇 “New repository”。填寫以下內容&#xff1a; Repository name&#xff1a;倉庫名稱&#xff0c;例如 my-private-repo。Description&#xff1a;可選&#xff0c;倉庫描述。Visibility&…

量產技巧之RK3588 Android12默認移除導航欄狀態欄?

本文介紹使用源碼編譯默認去掉導航欄/狀態欄方法,以觸覺智能EVB3588開發板演示&#xff0c;Android12系統&#xff0c;搭載了瑞芯微RK3588芯片&#xff0c;該開發板是核心板加底板設計&#xff0c;音視頻接口、通信接口等各類接口一應俱全&#xff0c;可幫助企業提高產品開發效…

Conda 安裝與配置詳解及常見問題解決

《Conda 安裝與配置詳解及常見問題解決》 安裝 Conda 有兩種主流方式&#xff0c;分別是安裝 Miniconda&#xff08;輕量級&#xff09;和 Anaconda&#xff08;包含常用數據科學包&#xff09;。下面為你詳細介紹安裝步驟和注意要點。 一、安裝 Miniconda&#xff08;推薦&a…

Linux ——lastb定時備份清理

lastb 命令顯示的是系統中 /var/log/btmp 文件中的SSH 登錄失敗記錄。你可以像處理 wtmp 那樣&#xff0c;對 btmp 文件進行備份與清理。? 一、備份 lastb 數據cp /var/log/btmp /var/log/btmp.backup.$(date %F)會保存為如 /var/log/btmp.backup.2025-07-14? 二、清空 lastb…

自定義類型 - 聯合體與枚舉(百度筆試題算法優化)

目錄一、聯合體1.1 聯合體類型的聲明1.2 聯合體的特點1.3 相同成員的結構體和聯合體對比1.4 聯合體大小的計算1.5 聯合練習二、枚舉類型2.1 枚舉類型的聲明2.2 枚舉類型的優點總結一、聯合體 1.1 聯合體類型的聲明 像結構體一樣&#xff0c;聯合體也是由一個或者多個成員構成…

FS820R08A6P2LB——英飛凌高性能IGBT模塊,驅動高效能源未來!

產品概述FS820R08A6P2LB 是英飛凌&#xff08;Infineon&#xff09;推出的一款高性能、高可靠性IGBT功率模塊&#xff0c;采用先進的EconoDUAL? 3封裝&#xff0c;專為大功率工業應用設計。該模塊集成了IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;和二極管&#xff0c;適…

python學智能算法(十八)|SVM基礎概念-向量點積

引言 前序學習進程中&#xff0c;已經對向量的基礎定義有所了解&#xff0c;已經知曉了向量的值和方向向量的定義&#xff0c;學習鏈接如下&#xff1a; 向量的值和方向 在此基礎上&#xff0c;本文進一步學習向量點積。 向量點積 向量點積運算規則&#xff0c;我們在中學階…

【windows辦公小助手】比文檔編輯器更好用的Notepad++輕量編輯器

Notepad 中文版軟件下載&#xff1a;這個路徑總是顯示有百度無法下載&#xff0c;不推薦 更新&#xff1a;推薦下載路徑 https://github.com/notepad-plus-plus/notepad-plus-plus/releases 參考博主&#xff1a;Notepad的安裝與使用

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析

2025年7月12日全國青少年信息素養大賽圖形化(Scratch)編程小學高年級組復賽真題+答案解析 選擇題 題目一 運行如圖所示的程序,舞臺上一共會出現多少只小貓呢?( ) A. 5 B. 6 C. 7 D. 8 正確答案: B 答案解析: 程序中“當綠旗被點擊”后,角色先移到指定位置,然后“重…

對于獨熱編碼余弦相似度結果為0和詞向量解決了詞之間相似性問題的理解

文章目錄深入理解簡單案例結論詞向量&#xff08;Word Embedding&#xff09;簡介詞向量如何解決相似性問題&#xff1f;簡單案例&#xff1a;基于上下文的詞向量訓練總結對于獨熱表示的向量&#xff0c;如果采用余弦相似度計算向量間的相似度&#xff0c;可以明顯的發現任意兩…

數據結構·數狀數組(BIT)

樹狀數組(Binary Index Tree) 英文名&#xff1a;使用二進制下標的樹結構 理解&#xff1a;這個樹實際上用數組來存&#xff0c;二進制下標就是將正常的下標拆為二進制來看。 求x的最低位1的函數lowbit&#xff08;x&#xff09; 假設x的二進制表示為x ...10000&#xff0c;…