Spring原理揭秘--Spring的AOP

在這之前我們已經介紹了AOP的基本功能和概念,那么當AOP集成到spring則會發生改變。

Spring AOP 中的Joinpoint:

之前提高了很多Joinpoint的類型,但是在spring中則只會有方法級別的Joinpoint,像構造方法,字段的調用都沒適配。原因是Spring框架一直追求輕量級和高效,而僅僅采用方法級的Joinpoint即可滿足百分之八十的需求。同時如果采用類中的屬性級別的Joinpoint則會破壞對象的封裝。如果需求非常特殊超過了拿百分之八十的需求那么不妨可以使用AspectJ的方式。

Spring AOP 中的Pointcut:

Spring中以接口定義Pointcut作為其最頂層的抽象接口,該接口定義了兩個方法用來幫助捕獲系統中相應的Joinpoint

兩個方法的ClassFilter和MethodMatcher分別是用來匹配將執行織入操作的對象以及相應的方法。

也就是說ClassFilter是對于類型對象的匹配而MethodMatcher則是對于方法級別的匹配,

MethodMatcher的復雜度相比于ClassFilter要高。原因是ClassFilter僅僅只需要匹配類型即可而MethodMatcher則可能需要匹配方法名稱或者方法名稱+參數

因此對于MethodMatcher則有多個方法進行匹配

有兩個matches的方法,而這兩個方法的分界線就是isRuntime方法。在對具體的方法進行攔截的時候,可以忽略每次方法執行的時候調用者傳入的參數,也可以每次都檢查這些方法調用參數,以強化攔截條件,都是與isRuntime的返回值有關如果返回值為false則會觸發第一個matches方法這種屬于不會考慮具體方法的參數,而如果返回結果為true則會調用第二個matches方法表示采用參數的匹配

將這兩個MethodMatcher類型分為StaticMethodMatcher和DynamicMethodMatcher類型。StaticMethodMatcher類型則是無參數檢查,這種無需參數檢查的類型可以緩存在框架內部,同時性能比較出色,對于DynamicMethodMatcher類型是參數檢查,因此不會進行緩存操作,同時性能上相比StaticMethodMatcher則是損耗很大。

常見的PointCut

下面我們來介紹幾個常見的PointCut

NameMatchMethodPointcut:

這個是最簡單的Pointcut實現,屬于StaticMethodMatcher的子類,可以根據自身指定的一組方法名稱與Joinpoint處的方法的名稱進行匹配

JdkRegexpMethodPointcut和Perl5RegexpMethodPointcut

StaticMethodMatcher的子類有一個專門基于正則表達式的實現分支,而JdkRegexpMethodPointcut和Perl5RegexpMethodPointcut則是不同類型的正則表達式的具體實現。

AnnotationMatchingPointcut

根據目標對象中是否存在指定類型的注解來匹配Joinpoint,要使用該類型的Pointcut首先需要聲明相應的注解。

CompossablePointcut

提供邏輯運算功能,而ComposablePointcut就是Spring AOP提供的可以進行Pointcut邏輯運算的Pointcut實現。它可以實現Pointcut之間的并以及交運算。

ControlFlowPointcut

ControlFlowPointcut則是最特殊的Pointcut類型,在理解和使用上都需要我們多付出點腦細胞,ControlFlowPointcut匹配程序的調用流程,不是對某個方法執行所在的Joinpoint處的單一特征進行匹配。通過ControlFlowPointcut我們可以實現指定只有當某個類的方法在被執行的類對象調用的時候才會對方法進行攔截處理

Spring AOP中的Advice

Advice實現了將被織入到Pointcut規定的Joinpoint處的橫切邏輯。在spring中,advice按照其自身實例能否在目標對象類的所有實例中共享這一標準,可以劃分為兩大類,即per-class類型的advice和per-instance類型的advice。

per-class類型的Advice

per-class類型的Advice是指該類型的實例可以在目標對象類的所有實例之間進行共享,這種類型的Advice只是提供方法攔截的功能,不會為目標對象類保存任何狀態或者添加新的特性。

那么per-class有著以下幾種類型

Before advice

實現的橫切邏輯將在相應的Joinpoint之前執行,在Before advice執行完成之后,程序執行流程將從Joinpoint處繼續執行,所以Before Advice通常不會打斷程序執行的流程,但是如果有必要,也可以通過拋出相應異常的形式中斷程序流程

ThrowsAdvice

throwsAdvice通常用于對系統重特定的異常情況的監控,以統一的方式對所發生的異常進行處理,一旦捕獲到異常,需要馬上以某種方式通知系統的監控或者運營人員

AfterReturningAdvice

通過spring的AfterReturningAdvice,我們可以訪問當前joinpoint的方法返回值,方法,方法參數以及所在的目標對象

Around Advice

Spring AOP沒有提供AfterAdvice,使得我們沒有一個合適的advice類型來承載類似于系統資源清除之類的橫切邏輯。Spring AOP的AfterReturningAdvice不能更改Joinpoint所在方法的返回值,使得我們在方法正常返回后無法對其進行更多的敢于。有了Around Advice則可以解決這個問題

per-instance類型的Advice

在Spring AOP當中只有一個類型的per-instance型Advice就是Introduction

Introduction

Introduction允許你在不修改目標類代碼的情況下,為其動態添加新的接口和實現。這相當于在運行時為目標對象 “混入” 額外的行為,使其具備原本沒有的功能。

// 定義新接口
public interface Monitorable {void setMonitorActive(boolean active);boolean isMonitorActive();
}// 實現接口和 IntroductionInterceptor
public class MonitorInterceptor implements MethodInterceptor, Monitorable {private boolean monitorActive = false;@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {if (monitorActive && invocation.getMethod().getName().startsWith("get")) {System.out.println("Monitoring: " + invocation.getMethod().getName());}return invocation.proceed();}@Overridepublic void setMonitorActive(boolean active) {this.monitorActive = active;}@Overridepublic boolean isMonitorActive() {return monitorActive;}
}// 創建 IntroductionAdvisor
public class MonitorAdvisor extends DefaultIntroductionAdvisor {public MonitorAdvisor() {super(new MonitorInterceptor(), Monitorable.class);}
}
增強類型作用是否改變類結構
Before/After在方法前后添加行為
Around環繞方法執行,完全控制調用過程
Introduction為目標對象添加新接口和實現是(運行時)

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

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

相關文章

C++學習筆記五

C繼承//基類 class Animal{};//派生類 class Dog : public Animal{};#include<iostearm> using namespace std;//基類 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生類 class Rectangle …

AndroidStudio環境搭建

一、AndroidStudio下載 正常百度出來的站會自動翻譯成中文&#xff0c;導致歷史版本的界面總是顯示不出可下載的地方&#xff0c;點擊成切回英文&#xff0c;就能看出了。 歷史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大廠面試實錄:從Spring Boot到AI大模型的深度技術拷問

場景&#xff1a;互聯網大廠Java后端面試 面試官&#xff08;嚴肅&#xff09;&#xff1a;小曾&#xff0c;請坐。今天主要考察Java后端技術棧&#xff0c;包括微服務、大數據、AI等。我們先從簡單問題開始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架構設計

HDFS概述與核心設計原則作為Hadoop生態系統的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一種專為大規模數據處理而設計的分布式文件系統。它的核心設計理念源于對互聯網時代數據特征的深刻洞察——數據規模呈指數級增長&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;講了soc的加密方式&#xff0c;但是soc資源充足&#xff0c;mcu沒有&#xff0c;所以不會用openss生成公私鑰 切計算哈希用rsa256位。 ECC&#xff08;橢圓曲線加密&#xff09; 是一種非對稱加密算法&…

LangChain面試內容整理-知識點23:實戰案例:檢索增強生成(RAG)系統

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種將LLM與外部知識庫結合的方法,通過實時檢索相關信息來輔助生成答案。這極大緩解了LLM“封閉知識”過期或不足的問題。LangChain非常適合構建RAG系統,因為它提供了文檔加載、向量存儲、檢索接口、LLM組合的一站式方…

探索阿里云ESA:開啟邊緣安全加速新時代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全稱邊緣安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身為全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了這…

醋酸鈰:賦能科技創新的稀土之力

一、什么是醋酸鈰醋酸鈰是鈰元素與醋酸根離子形成的化合物。鈰作為稀土元素中的重要一員&#xff0c;廣泛應用于材料科學、催化劑、電子產品等領域。醋酸鈰以無色結晶或淺黃色結晶的形式存在&#xff0c;是鈰的有機鹽之一。它不僅具有穩定的化學性質&#xff0c;而且在某些特定…

數據結構之普利姆算法

前言&#xff1a;Prim算法是圖論中的算法&#xff0c;用來生成圖的最小生成樹。本篇文章介紹算法的流程&#xff0c;實現思想&#xff0c;和具體代碼實現&#xff0c;使用c語言。學習需要輸出才能理解的更透徹&#xff0c;所以說堅持寫文章&#xff0c;希望可以用自己的方式把一…

構建強大的物聯網架構所需了解的一切

數據正驅動著當今的商業發展&#xff0c;而物聯網&#xff08;IoT&#xff09;則有助于為企業的增長和創新開辟新的機遇。麥肯錫的研究表明&#xff0c;全球數據在四年內實現了驚人的 7 倍增長。隨著越來越多的物聯網設備進入市場&#xff0c;更多企業開始需要強大的物聯網架構…

java之json轉excel生成

背景 業務為實現自定義樣式excel的導出&#xff0c;常規的做法就是根據數據在代碼中進行類似模版的配置&#xff1b;這樣的體驗不是很好&#xff0c;只要用戶改變下樣式的設置不用代碼改動就能實現自定義excel的導出更加靈活。 以下是具體實現 pom依賴 <dependency><g…

新版本Cursor中配置自定義MCP服務器教程,附MCP工具開發實戰源碼

在 Cursor 中配置自定義 MCP 服務器&#xff1a;打造你的 AI 開發工具鏈 引言 隨著 AI 編程助手的普及&#xff0c;開發者們越來越希望能夠定制化自己的開發環境。Cursor 作為一款強大的 AI 編程編輯器&#xff0c;提供了 Model Context Protocol (MCP) 支持&#xff0c;新版本…

前端面試十二之vue3基礎

一、ref和reactive在 Vue 3 中&#xff0c;ref 和 reactive 是兩種主要的響應式數據創建方式&#xff0c;它們各有特點和適用場景。1.refref 主要用于創建單個值的響應式引用&#xff0c;通常用于基本類型數據&#xff0c;如數字、字符串等。使用 ref 創建的引用對象可以通過 .…

設計模式四:裝飾模式(Decorator Pattern)

裝飾模式是一種結構型設計模式&#xff0c;它允許你動態地給一個對象添加額外的職責&#xff0c;相比繼承更加靈活。1. 模式定義裝飾模式&#xff1a;動態地給一個對象添加一些額外的職責。就增加功能來說&#xff0c;裝飾模式相比生成子類更為靈活。2. 模式結構主要角色&#…

神經網絡常見激活函數 14-Mish函數

文章目錄Mish函數導函數函數和導函數圖像優缺點PyTorch 中的 Mish 函數TensorFlow 中的 Mish 函數Mish 論文 https://arxiv.org/pdf/1908.08681 函數導函數 Mish函數 Mish(x)x?tanh??(softplus(x))x?tanh??(ln??(1ex))\begin{aligned} \text{Mish}(x) & x \cdot \t…

LAMP遷移LNMP Nginx多站點配置全流程

文章目錄前言備份與停止服務nginx安裝與配置nginx 編譯安裝配置服務php-fpm多站點配置phf-fpm介紹多站點配置nginx 多站點配置nginx ssl 配置參考前言 之前服務器使用的是 LAMP環境&#xff0c;想充分利用服務器資源&#xff0c;再運行另外一個站點 在LAMP環境下應該是也可以…

Nginx屏蔽國外IP訪問

下載IP列表 # 下載到文件 wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest # 直接輸出到終端 curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest得到一份國內IP配置 # 原始IP列表格式&#xff1a;apnic|CN|ipv4|218.78.0.0|1310…

stl-string模擬

1.介紹主要進行cpp中string的模擬&#xff0c;方便我們更好的對stl進行使用&#xff0c;string沒有模板&#xff0c;我們將頭文件和函數寫在兩個不同的文件2.頭文件3.cpp文件如有問題&#xff0c;歡迎糾正&#xff01;

基于MATLAB的極限學習機ELM的數據回歸預測方法應用

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔&#xff09;&#xff0c;如需數據代碼文檔可以直接到文章最后關注獲取 或者私信獲取。 1.項目背景 在當今的數據驅動時代&#xff0c;準確且高效的預測模型對于解決復雜問題至關重要。極限學習機&#…

芯谷科技--雙四通道模擬/數字多路復用器74HC4052

在電子系統中&#xff0c;信號的多路復用與解復用是常見的需求&#xff0c;特別是在需要對多個信號源進行選擇和切換的場景中。芯谷科技推出的 74HC4052 雙四通道模擬/數字多路復用器/解復用器&#xff0c;以其高效、靈活的設計&#xff0c;為工程師提供了可靠的解決方案。產品…