Spring AOP常見(jiàn)使用場(chǎng)景、術(shù)語(yǔ)及設(shè)計(jì)模式應(yīng)用方式
AOP(面向切面編程)是一種編程思想,可以將程序中的橫切關(guān)注點(diǎn)(如日志記錄、安全性檢查、性能監(jiān)控等)從業(yè)務(wù)邏輯中分離出來(lái),以便更好地管理和維護(hù)。
使用場(chǎng)景
- 日志記錄:在程序執(zhí)行期間,記錄關(guān)鍵操作的執(zhí)行情況、錯(cuò)誤信息等。
- 安全性檢查:在程序執(zhí)行期間,檢查用戶的權(quán)限或身份驗(yàn)證,以確保只有授權(quán)的用戶才能執(zhí)行特定的操作。
- 事務(wù)管理:確保多個(gè)操作在一個(gè)事務(wù)中執(zhí)行,以確保數(shù)據(jù)的完整性和一致性。
- 性能監(jiān)控:監(jiān)控程序執(zhí)行的性能,包括執(zhí)行時(shí)間、內(nèi)存使用等指標(biāo),以便進(jìn)行優(yōu)化。
- 異常處理:在程序執(zhí)行期間捕獲和處理異常,以避免程序崩潰或出現(xiàn)未知錯(cuò)誤。
- 緩存管理:管理程序中的緩存,包括緩存的存儲(chǔ)、刷新和刪除等操作。
- 國(guó)際化:管理程序中的國(guó)際化資源,以便程序能夠在不同的語(yǔ)言環(huán)境中正確地運(yùn)行。
常用術(shù)語(yǔ)
在 AOP 中,有一些常用的術(shù)語(yǔ),包括 Aspect、Join Point 和 Advice 等,下面對(duì)這些術(shù)語(yǔ)進(jìn)行解釋:
Aspect
:切面,用于描述一個(gè)橫切關(guān)注點(diǎn)的概念,通常是一個(gè)類或模塊,其中包含了一組通用的橫切關(guān)注點(diǎn)。Join Point
:連接點(diǎn),用于描述程序中的一個(gè)執(zhí)行點(diǎn),例如一個(gè)方法的調(diào)用、一個(gè)屬性的賦值、一個(gè)異常的拋出等等。在 AOP 中,Join Point 是 AOP 框架中可以被攔截的程序執(zhí)行點(diǎn)。Advice
:通知,用于描述一個(gè)特定的橫切關(guān)注點(diǎn)所執(zhí)行的操作,包括前置通知(Before)、后置通知(After)、環(huán)繞通知(Around)、異常通知(After-Throwing)和返回通知(After-Returning)等等。Pointcut
:切入點(diǎn),用于描述一個(gè)或多個(gè) Join Point 的集合,通常用一個(gè)表達(dá)式來(lái)定義。Target Object
:目標(biāo)對(duì)象,用于描述被通知的對(duì)象,即包含 Join Point 的對(duì)象。Weaving
:織入,用于描述將 Aspect 中定義的 Advice 插入到目標(biāo)對(duì)象的過(guò)程,通常是在程序運(yùn)行期間完成的。
設(shè)計(jì)模式應(yīng)用
在 AOP 中,代理、裝飾器和攔截器等設(shè)計(jì)模式經(jīng)常被使用,下面分別介紹它們?cè)?AOP 中的應(yīng)用:
- 代理模式:代理模式在 AOP 中的應(yīng)用較為廣泛。在 AOP 中,代理模式通常用于實(shí)現(xiàn)動(dòng)態(tài)代理,即在程序運(yùn)行時(shí)生成代理對(duì)象,代理對(duì)象包含了目標(biāo)對(duì)象的所有方法,并且可以在方法執(zhí)行前后插入額外的邏輯,如日志記錄、性能監(jiān)控、事務(wù)管理等。
- 裝飾器模式:裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它可以動(dòng)態(tài)地為一個(gè)對(duì)象添加新的行為,而不需要對(duì)原始類進(jìn)行修改。在 AOP 中,裝飾器模式通常用于實(shí)現(xiàn) Aspect,即將一組通用的橫切關(guān)注點(diǎn)包裝在一個(gè) Aspect 中,然后將 Aspect 應(yīng)用到目標(biāo)對(duì)象中。
- 攔截器模式:攔截器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它可以在不修改原始類的情況下,通過(guò)攔截并修改方法的調(diào)用,來(lái)實(shí)現(xiàn)額外的邏輯。在 AOP 中,攔截器模式通常用于實(shí)現(xiàn) Advice,即在特定的 Join Point 上執(zhí)行特定的操作,例如在方法執(zhí)行前后記錄日志、驗(yàn)證權(quán)限、處理異常等。
示例代碼
下面是一個(gè)簡(jiǎn)單的 Spring AOP 示例代碼:
包含了如何定義切面、定義通知以及如何使用 AOP 在目標(biāo)對(duì)象上進(jìn)行攔截和增強(qiáng):
//定義一個(gè)切面 @Aspect @Component public class LoggingAspect { //定義一個(gè)前置通知,攔截所有 public 方法 @Before("execution(public * com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("執(zhí)行方法:" + joinPoint.getSignature().getName()); } //定義一個(gè)后置通知,攔截所有 save 方法 @AfterReturning(pointcut = "execution(* com.example.service.*.save*(..))", returning = "result") public void logAfter(JoinPoint joinPoint, Object result) { System.out.println("方法執(zhí)行結(jié)束:" + joinPoint.getSignature().getName() + ",返回值為:" + result); } } //定義一個(gè)業(yè)務(wù)類 @Service public class UserService { public void login(String username, String password) { System.out.println("用戶登錄"); } public void saveUser(User user) { System.out.println("保存用戶信息"); } } //在配置類中開(kāi)啟 AOP @Configuration @EnableAspectJAutoProxy public class AppConfig { }
在上述示例代碼中,首先定義了一個(gè)切面 LoggingAspect,使用 @Aspect 和 @Component 注解進(jìn)行標(biāo)記。然后,在 LoggingAspect 中定義了兩個(gè)通知方法,一個(gè)前置通知 logBefore,攔截所有 public 方法;一個(gè)后置通知 logAfter,攔截所有 save 方法。
接下來(lái),在 UserService 類中定義了兩個(gè)業(yè)務(wù)方法,login 和 saveUser。最后,在 AppConfig 配置類中使用 @EnableAspectJAutoProxy 注解開(kāi)啟 AOP。
在程序運(yùn)行時(shí),當(dāng)調(diào)用 UserService 的 login 或 saveUser 方法時(shí),AOP 框架會(huì)自動(dòng)攔截這些方法,并根據(jù) LoggingAspect 中定義的通知方法,執(zhí)行相應(yīng)的增強(qiáng)邏輯。
例如,當(dāng)調(diào)用 saveUser 方法時(shí),AOP 框架會(huì)先執(zhí)行 logBefore 方法,在方法執(zhí)行前輸出日志;然后執(zhí)行 saveUser 方法;最后執(zhí)行 logAfter 方法,在方法執(zhí)行后輸出日志。
總之,Spring AOP 是一種非常強(qiáng)大的 AOP 框架,可以大大簡(jiǎn)化開(kāi)發(fā)者的工作,提高代碼的可維護(hù)性和可重用性。開(kāi)發(fā)者可以通過(guò)上述示例代碼學(xué)習(xí)如何使用 Spring AOP 進(jìn)行攔截和增強(qiáng)目標(biāo)對(duì)象的操作。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA中如何構(gòu)建Spring Boot的項(xiàng)目
這篇文章主要介紹了IntelliJ IDEA中如何構(gòu)建Spring Boot的項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07@Scheduled 如何讀取動(dòng)態(tài)配置文件
這篇文章主要介紹了@Scheduled 如何讀取動(dòng)態(tài)配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題
這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12關(guān)于spring?boot使用?jdbc+mysql?連接的問(wèn)題
這篇文章主要介紹了spring?boot使用?jdbc+mysql?連接,在這里mysql?8.x版本驅(qū)動(dòng)包,要使用?com.mysql.cj.jdbc.Driver作為驅(qū)動(dòng)類,文中給大家詳細(xì)介紹,需要的朋友可以參考下2022-03-03Spring?Data?JPA實(shí)現(xiàn)持久化存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫(kù)的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套 JPA 應(yīng)?框架,可使開(kāi)發(fā)者?極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作。本文我們來(lái)了解如何用Spring?Data?JPA框架實(shí)現(xiàn)數(shù)據(jù)持久化存儲(chǔ)到數(shù)據(jù)庫(kù),感興趣的可以了解一下2022-04-04Maven Spring jar包啟動(dòng)報(bào)錯(cuò)問(wèn)題解決方案
maven 編譯jar包,放在linux服務(wù)器啟動(dòng)不起來(lái),提示:xxxx-0.0.1-SNAPSHOT.jar中沒(méi)有主清單屬性,接下來(lái)通過(guò)本文給大家分享問(wèn)題原因及解決方案,感興趣的朋友跟隨小編一起看看吧2023-10-10SpringBoot3整合郵件服務(wù)實(shí)現(xiàn)郵件發(fā)送功能
本文介紹了spring boot整合email服務(wù),實(shí)現(xiàn)發(fā)送驗(yàn)證碼,郵件(普通文本郵件、靜態(tài)資源郵件、附件郵件),文中通過(guò)代碼示例介紹的非常詳細(xì),堅(jiān)持看完相信對(duì)你有幫助,需要的朋友可以參考下2024-05-05