Spring Boot (9):AOP實戰經驗

1 概述

????????? 介紹完Spring AOP所具備的功能特性,接下來,看一下再應用程序中使用AOP時應該遵循哪些最佳實踐。

2 活用切點表達式

????????Spring AOP的一大特色在于在開發人員提供了非常靈活的切點機制。Spring在編譯期間處理切入點,并嘗試進行優化匹配。然后,檢查代碼中的匹配規則將是一個代價高昂的過程。因此,為了獲得最佳性能,需要仔細考慮想要實現的目標,并盡可能縮小搜索或匹配條件的范圍。在前面已經看到過一個切點表達式,如下:

@Pointcut("execution(* com.jay.aop.service.AccountService.doAccountTransaction(..))")public void doAccountTransaction(){}

? ? ? ? 在這里的execution()代表的就是表達式的主體,它的基本語法如下,其中“?”部分表示可選項。

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(paramPattern)throws-pattern?)? ? ? ??????????

? ? ? ? 這個表達式看似復雜,但是逐步分解所有的模式,它們其實就是描述了一個方法的特征。

? ? ? ? modifiers-pattern:表示方法的修飾符

? ? ? ? ret-type-pattern:表示方法的返回值

? ? ? ? declaring-type-pattern:表示方法所在的類的路徑

? ? ? ? name-pattern:表示方法名

? ? ? ? param-pattern:表示方法的參數

? ? ? ? throws-pattern:表示方法拋出異常。

? ? ? ? 這些模式的作用就是完成切點的匹配。在各個模式中,可以使用"*"來表示匹配所有選項。Spring AOP還為開發人員提供了一組非常有用的描述符來簡化切點表達式的使用過程。例如,args描述符表示方法的參數屬于一個特定的類;within描述符表示方法屬于一個特定類;target描述符表示方法所屬的類等。

? ? ? ? 為了獲得良好的性能,在設計切點表達式時,至少應該包含方法和類型模式。這并不是說如果只使用方法或類型模式中的一種,匹配就會不生效,而是因為類型模式的匹配過程非常快,它通過快速選擇無法進一步處理的連接點來縮小搜索空間。同時,建議在空方法上聲明切點,并通過空方法引用這些切點。

? ? ? ? 另一種最佳實踐在于盡量聲明小的切點,并把它們組合起來構建復雜的切點。下面代碼展示了定義小切點并將它們連接起來的代碼實例。

@Pointcut("execution(public * *(..))")private void anyPublicMethod(){}@Pointcut("execution(* com.jay.aopproxy.service.impl.AccountServiceImpl.doAccountTransaction(..))")public void doSomething(){}@Pointcut("anyPublicMethod() && doAccountTransaction()")private void transactionOperation(){}

? ? ? ? 這里的transactionOperation()就是由anyPublicMethod()和doAccountTransaction()這兩個切點組合而成的。

3 Spring AOP面試題分析

3.1 Spring AOP是基于什么技術體系實現的?

? ? ? ? 解答:Spring AOP的實現依賴代理機制。代理機制在具體實現上一般有兩種方式,一種是靜態代理機制,一種是動態代理機制。Spring AOP基于動態代理模式提供了面向切面機制。

3.2 Spring AOP提供了那些類型的通知機制?

? ? ? ? 解答:Spring AOP的通知機制類型非常豐富,開發人員可以在方法執行之前、之后、前后、返回以及拋出異常時實現各種自定義的通知邏輯。而且,Spring AOP實現通知的方式使用注解來標記,這些注解包括@Before、@After、@Around、@AfterReturning和@AfterThrowing等,分別對應于方法執行的各個階段。

3.3 Spring AOP使用了哪幾種動態代理機制?性能上哪種更優?

? ? ? ? 解答:常見的動態代理實現技術包括JDK自帶的代理類、第三方的CGLIB和javassist。Spring AOP使用的是JDK和CGLIB。從性能上講,JDK動態代理效率高于CGLIB。

3.4 如果想要在一個類的內部方法實現AOP,有什么辦法?

? ? ? ? 解答:關于Spring AOP有一點需要注意,只能在方法的調用過程中嵌入通知機制。這是一個很重要的限制,會導致對同一個類中的內部方法無法有效地實施動態代理。這是用可以使用Spring AOP提供的AopContext上下文對象來獲取當前的AOP代理。AopContext是一個非常有用的工具類,想要獲取該類,需要確保ProxyFactoryBean的exposeProxy屬性被設置為true。

3.5 如果想要基于Spring AOP實現對切點的精細化管理,有什么策略?

? ? ? ? 解答:Spring AOP創建切點的方式是非常靈活的,Spring專門提供了一個execution()配置方法。可以根據方法的修飾符、返回值、類路徑、方法名、方法參數以及異常信息來設置方法調用與切點的匹配規則。這是實現精細化管理的一個維度。

? ? ? ? 第二個精細化管理的維度是設置切點的粒度。可以盡量聲明小的切點,并把它們組合起來構建復雜的切點。這樣,切點之間就具備了靈活的可重用性以及組合性。

? ? ? ?

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

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

相關文章

計算機的錯誤計算(二十四)

摘要 計算機的錯誤計算(二十一)就案例 展示了“兩個不相等數相減,差為0”。本節給出新的計算過程:不停增加計算精度直到出現非0結果。這個過程與結果表明,即使是專業數學軟件,對這個問題的處理&#xff0…

1 HTML and CSS

HTMl(超文本標記語言) HTML 概述 超文本標記語言用來描述和定義網頁的內容 HTML(超文本標記語言——HyperText Markup Language)是構成 Web 世界的一磚一瓦;它定義了網頁內容的含義和結構 “超文本”(hypertext)是指連接單個網站內或多個網站間的網頁的鏈接 1. HTML標簽功能區分…

Qt之多線程編程(QThread)

文章目錄 前言Qt多線程的基本使用如何移動線程常用的一些函數示例代碼總結 前言 在現代計算機系統中,多線程編程已經成為一種常見的編程模式,它可以有效地利用多核處理器的計算能力,提高程序的執行效率。Qt作為一種跨平臺的應用程序開發框架…

【ffmpeg系列一】源碼構建,ubuntu22與win10下的過程對比。

文章目錄 背景ubuntu22結論 win10過程 對比結論 背景 順手編譯個ffmpeg試試,看看不同平臺下誰的配置比較繁瑣。 先讓gpt給出個教程: ubuntu22 使用elementary-os7.1構建,看看有幾個坑要踩。 錯誤1: 依賴libavresample-dev未…

Linux-學習-05-openssl安裝與卸載

目錄 一、環境信息 二、卸載步驟 1、使用包管理器卸載 三、安裝步驟 1、下載OpenSSL源代碼 2、解壓并進入目錄 3、配置、編譯和安裝 4、更新軟鏈接 5、更新共享庫緩存 6、/etc/profile添加環境變量 7、環境變量生效 8、openSSL版本驗證 一、環境信息 名稱值CPUInte…

【人工智能】-- 智能家居

個人主頁:歡迎來到 Papicatch的博客 課設專欄 :學生成績管理系統 專業知識專欄: 專業知識 文章目錄 🍉引言 🍉基于深度卷積神經網絡的表情識別 🍈流程圖 🍈模型設計 🍍網絡架…

[圖解]企業應用架構模式2024新譯本講解24-標識映射3

1 00:00:00,460 --> 00:00:02,580 超類定義了一個抽象方法 2 00:00:03,170 --> 00:00:03,450 3 00:00:06,410 --> 00:00:09,690 把reader內容 4 00:00:10,870 --> 00:00:12,350 把它變成一個領域對象 5 00:00:13,690 --> 00:00:15,800 但這里只是把它變成一個…

python安裝PyTorch+cuda

1,最終結果 import torchprint(torch.cuda.is_available()) #顯示True,則安裝成功 print(torch.__version__)#打印當前PyTorch版本號。 print(torch.version.cuda)#打印當前CUDA版本號。 print(torch.backends.cudnn.version())# 打印當前cuDNN版本號。 print(torc…

Ruby 語法

Ruby 語法 Ruby 是一種動態、開放源代碼的編程語言,由日本的松本行弘(Yukihiro Matsumoto)于1995年開發。Ruby 的設計哲學強調簡潔和效率,同時也是一種表達力強的語言。它結合了多種編程語言的特性,包括 Perl、Smalltalk、Eiffel、Ada 和 Lisp。Ruby 的語法簡單直觀,使得…

【愛上C++】vector用法詳解

文章目錄 一:vector簡介二:vector的創建和初始化三:vector的遍歷1.[]下標2.at()3.迭代器遍歷4.范圍for 四:vector的空間1.size2.max_size3.capacity4.reserve5.resize6.empty 五:vector的增刪查改1.push_back2.pop_back3.find4.insert5.erase6.swap7.assign Hello~同學們好&…

mAP(平均精度均值)全面解讀:評估目標檢測性能的黃金標準

mAP(平均精度均值)全面解讀:評估目標檢測性能的黃金標準 在目標檢測領域,評估模型性能是至關重要的一步。mAP(mean Average Precision,平均精度均值)作為目標檢測任務中一個關鍵的性能評估指標…

搭建純凈的SpringBoot工程

pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVe…

docker nginx mysql redis

啟動沒有數據卷的nginx docker run -d -p 86:80 --name my-nginx nginx把/etc/nginx中的配置復制到宿主機 docker cp my-nginx:/etc/nginx /home/nginxlkl把/html 中的文件復制到宿主機 docker cp my-nginx:/etc/nginx /home/nginxlkl刪除當前鏡像 docker rm -f my-nginx重新起…

ArrayList,Vector, LinkedList的存儲性能和特性舉例說明

ArrayList、Vector、LinkedList是Java中常用的三種集合類型&#xff0c;它們各自具有不同的存儲性能和特性。下面將分別舉例說明這三種集合的存儲性能和特性&#xff1a; ArrayList 存儲性能與特性&#xff1a; 底層實現&#xff1a;ArrayList底層是通過數組實現的&#xff…

Solidity:變量數據存儲和作用域 storage/memory/calldata

Solidity中的引用類型? 引用類型(Reference Type)&#xff1a;包括數組&#xff08;array&#xff09;和結構體&#xff08;struct&#xff09;&#xff0c;由于這類變量比較復雜&#xff0c;占用存儲空間大&#xff0c;我們在使用時必須要聲明數據存儲的位置。 數據位置? …

HarmonyOS ArkUi 字符串<展開/收起>功能

效果圖&#xff1a; 官方API&#xff1a; ohos.measure (文本計算) 方式一 measure.measureTextSize 跟方式二使用一樣&#xff0c;只是API調用不同&#xff0c;可仔細查看官網方式二 API 12 Preview Component export struct CustomTextSpan {State maxLines: number 1/…

迭代器模式(大話設計模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象類,用于定義得到開始對象、得到下一個對象、判斷是否到結尾、當前對象等抽象方法&#xff0c;統一接口 class Iterator { public:Iterator(){};virtu…

作為產品經理,如何用大模型給我們賦能?非常詳細,收藏我這篇就夠了

作為一名產品經理&#xff0c;如果您考慮轉行至大模型領域&#xff0c;您將能夠將產品管理技能與大模型技術相結合&#xff0c;從而在產品開發和創新方面獲得一系列好處。以下是轉行大模型對產品經理的一些潛在益處&#xff1a; 更深入的技術理解&#xff1a;了解大模型技術將…

LeetCode 1351, 1, 208

目錄 1351. 統計有序矩陣中的負數題目鏈接標簽簡答二分查找思路代碼 優化思路代碼 1. 兩數之和題目鏈接標簽思路代碼 208. 實現 Trie (前綴樹)題目鏈接標簽思路代碼 1351. 統計有序矩陣中的負數 題目鏈接 1351. 統計有序矩陣中的負數 標簽 數組 二分查找 矩陣 簡答二分查找…

使用 Python 處理 Lumerical 導出的 .txt 文件(完結)

使用 Python 處理 Lumerical 導出的 .txt 文件 引言正文以 , 隔開的波長與透射率以 \t 隔開的波長與透射率引言 之前在 添加鏈接描述 一文中我們已經介紹了如何將 Lumerical 仿真中的 S 參數相關數據導出為 .txt 文件。這里我們來分享如何使用 Python 對這些數據進行處理。 正…