Spring針對AOP詳細講解
什麼是Spring AOP
- AOP是面向切面編程。OOP是面向對象編程,AOP是一種思想,它是針對程序中的某一類的功能做統一的處理。比如用戶登錄權限的校驗,沒學AOP之前,我們所有需要判斷用戶登錄的頁面,AOP可以自動幫我們實現登錄驗證,不再需要每個方法中都寫相同的用戶登錄的驗證瞭。
- Spring AOP是一種框架,提供瞭一種對AOP 思想的實現,他們的關系和IoC與DI類似。
- 利用AOP可以對各個業務進行隔離, 從而是得業務各邏輯之間的耦合性降低, 提高瞭程序的可重用性, 同時提高開發效率
為什麼要用AOP?
- 之前處理用戶登錄的狀態驗證,每個Controller都要寫一遍用戶登錄,然而當你的功能越來越多的時候,你要寫的登錄驗證也越來越多,而這些方法都是相同的,對於這種功能統一,且使用的地方較多的功能,就可以考慮AOP來統一處理
- 除瞭統一的用戶登錄的判斷之外,AOP還可以實現:統一日志記錄,統一方法執行時間的統計,統一的返回格式設置,統一的異常處理,事務的開啟和提交
AOP的組成
- 切面:切面由切點和通知組成,針對於某一個功能的具體定義(相當於一個類),某一個功能可能是登錄驗證功能(一個AOP一個數據庫),也可能是日志記錄功能,一個功能對應一個切面。
- 切點:切點是切面中的某一個方法,用戶登錄驗證方法就是一個切點。
- 連接點:調用這些切點(方法)的頁面就是連接點
- 通知: 切點是一個空方法,通知是具體實現瞭這個方法,通知相當於切點的方法體。通知包括:前置通知,後置通知,返回之後通知,拋異常後的通知,環繞通知
Spring AOP的實現
- 添加Spring AOP框架支持
- 定義切面和切點
- 定義通知
導入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
定義切面和切點
- 類註解:@Aspect,@Component
- 方法註解:@Pointcut
@Component @Aspect //定義切面 public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..))") public void pointcut(){} }
定義通知Advice(5類)
- 通知是描述攔截執行的時機和具體的方法實現
- 註意環繞通知的寫法,可以記錄執行接口的時間
@Component @Aspect //定義切面 public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..))") public void pointcut(){} // 前置通知(要帶一個括號) @Before("pointcut()") public void doBefore(){ //業務代碼 System.out.println(); System.out.println("執行瞭前置通知"); System.out.println(); } } @Around("pointcut()") public Object doAround(ProceedingJoinPoint joinPoint){ Object result = null; //執行前置業務代碼 System.out.println("執行環繞通知的前置方法"); try { //執行(攔截的)業務方法 result = joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } //執行後置業務代碼 System.out.println("執行環繞通知的後置方法"); return result; }
到此這篇關於Spring針對AOP詳細講解的文章就介紹到這瞭,更多相關Spring AOP內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot開發教程之AOP日志處理
- 基於springboot實現一個簡單的aop實例
- SpringBoot整合Web之AOP配置詳解
- Spring基於AspectJ的AOP開發案例解析
- 淺談@Aspect@Order各個通知的執行順序