Spring (八)AOP-切面編程的使用

目錄

實現步驟:

1 導入AOP依賴

2 編寫切面Aspect

3 編寫通知方法

4 指定切入點表達式

5 測試AOP動態織入


圖示:

一 實現步驟:

1 導入AOP依賴

        <!-- Spring Boot AOP依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2 編寫切面Aspect

@Aspect         // 標記為切面類
@Component      // 由Spring容器管理
public class LogAspect {// 切入點表達式和通知方法在此定義
}

3 編寫通知方法

通知方法(Advice)?是面向切面編程(AOP)中的核心概念,表示在目標方法(或切入點)的某個執行階段插入的增強邏輯。通俗來說,就是“在某個地方(切入點)做某件事(增強邏輯)”。

通知方法的類型

Spring AOP 提供了5種通知類型,對應不同的執行時機:

注解執行時機典型場景
@Before目標方法執行前參數校驗、權限驗證
@After目標方法執行后(無論是否拋出異常)資源清理、日志記錄
@AfterReturning目標方法正常返回后(無異常時執行)記錄結果、緩存數據
@AfterThrowing目標方法拋出異常后異常處理、告警通知
@Around包圍目標方法(可自定義方法執行前后邏輯,甚至阻止方法執行)性能監控、事務管理


代碼實現:

package org.example.spring02.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class LogAspect {public void logStart() {System.out.println("【切面-日志】開始");}public void logEnd() {System.out.println("【切面-日志】結束");}public void logReturn() {System.out.println("【切面-日志】返回");}public void logException() {System.out.println("【切面-日志】異常:");}}

4 指定切入點表達式

作用:通過表達式定義哪些方法需要被攔截。
語法結構

execution([訪問權限] 返回類型 包名.類名.方法名(參數類型) [異常類型])

代碼實現:

精確指定接口的路徑:

    @Before("execution(int org.example.spring02.MathMethod.MathCalculator.*(..))")public void logStart() {System.out.println("【切面-日志】開始");}
package org.example.spring02.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class LogAspect {@Before("execution(int *(int,int))")public void logStart() {System.out.println("【切面-日志】開始");}@After("execution(int *(int,int))")public void logEnd() {System.out.println("【切面-日志】結束");}@AfterReturning("execution(int *(int,int))")public void logReturn() {System.out.println("【切面-日志】返回");}@AfterThrowing("execution(int *(int,int))")public void logException() {System.out.println("【切面-日志】異常:");}}

5 測試AOP動態織入

package org.example.spring02;import org.example.spring02.MathMethod.MathCalculator;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class AopTest {@AutowiredMathCalculator mc;@Testpublic void test01() {int add = mc.add(1, 2);System.out.println(add);}}

二 說說你對AOP的理解?

AOP全稱叫做?Aspect Oriented Programming(面向切面編程)。它是為解耦而生的,解耦是程序員編碼開發過程中一直追求的境界。AOP在業務類的隔離上,做到了解耦,其核心概念包括:


核心概念

  • 切面(Aspect)
    指關注點的模塊化,這些關注點可能會橫切多個對象。例如,事務管理是企業級Java應用中常見的橫切關注點。在Spring AOP中,切面可以通過以下方式實現:

    • 通用類基于模式的方式(schema-based approach)。

    • 在普通類中使用?@Aspect?注解(@AspectJ 注解方式)。

  • 連接點(Join Point)
    在程序執行過程中某個特定的點,例如方法調用的時間點或異常處理的時間點。在Spring AOP中,連接點僅表示方法的執行

  • 通知(Advice)
    在切面的特定連接點上執行的動作。通知類型包括:

    • around(環繞通知):包裹目標方法執行。

    • before(前置通知):在目標方法執行前觸發。

    • after(后置通知):在目標方法執行后觸發。
      許多AOP框架(包括Spring)通過攔截器模型實現通知,并維護以連接點為中心的攔截器鏈。

  • 切點(Pointcut)
    匹配連接點的斷言。通知通過切點表達式與連接點關聯,并在滿足條件的連接點上執行。Spring默認使用AspectJ切點語義,切點表達式與連接點的匹配是AOP的核心機制。

  • 引入(Introduction)
    向目標對象聲明額外的方法或字段。Spring允許向被通知的對象引入新接口(及其實現)。例如,可通過引入使Bean實現?IsModified?接口以簡化緩存機制(在AspectJ社區中,引入也稱為“內部類型聲明”)。

  • 目標對象(Target Object)
    被一個或多個切面通知的對象,也稱為“被通知對象”。由于Spring AOP基于運行時代理實現,目標對象始終是被代理的對象

  • AOP代理(AOP Proxy)
    AOP框架創建的對象,用于實現切面契約(如通知方法的執行)。在Spring中,AOP代理可以是以下兩種類型

    • JDK動態代理(基于接口)。

    • CGLIB代理(基于子類繼承)。


總結

AOP通過解耦橫切關注點(如日志、事務、安全等),提升代碼復用性和可維護性。其核心思想是通過代理機制動態織入,將公共邏輯與業務邏輯分離,最終實現高內聚、低耦合的系統設計。

任何一個系統都是由不同的組件組成的,每個組件負責一塊特定的功能。當然,會存在很多與業務無關的組件,例如日志、事務、權限等核心服務組件。這些核心服務組件經常融入到具體的業務邏輯中。如果我們為每一個具體業務邏輯操作都添加這樣的代碼,很明顯會導致代碼冗余過多。因此,我們需要將這些公共的代碼邏輯抽象出來,變成一個切面,然后注入到目標對象(具體業務)中去。正是基于這樣的一個思路實現的。通過動態代理的方式,將需要注入切面的對象進行代理。在進行調用的時候,將公共的邏輯直接添加進去,而不需要修改原有業務的邏輯代碼。只需要在原來的業務邏輯基礎之上做一些增強功能即可。

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

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

相關文章

開源數字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的開源數字人模型&#xff0c;專為 Windows 系統設計。基于先進的AI技術&#xff0c;僅需1秒視頻或1張照片&#xff0c;能在30秒內完成數字人形象和聲音克隆&#xff0c;在60秒內合成4K超高清視頻。Heygem支持多語言輸出、多表情動作&a…

uniapp開通開屏廣告后動態開啟或關閉開屏廣告

近期使用uniapp開發的APP有uniad的廣告對接&#xff0c;并且要求會員用戶不顯示包含開屏廣告在內的廣告&#xff0c;除開屏廣告外的廣告都可以通過uniapp廣告組件控制是否顯示 因uniad的開屏廣告無需代碼開發&#xff0c;經過uniad客服指點可在App.vue中的onLaunch生命周期中執…

神經網絡為什么要用 ReLU 增加非線性?

在神經網絡中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作為激活函數的主要目的是引入非線性&#xff0c;這是神經網絡能夠學習復雜模式和解決非線性問題的關鍵。 1. 為什么需要非線性&#xff1f; 1.1 線性模型的局限性 如果神經網絡只使用線性激活函數&…

使用SSH密鑰連接本地git 和 github

目錄 配置本地SSH&#xff0c;添加到github首先查看本地是否有SSH密鑰生成SSH密鑰&#xff0c;和郵箱綁定將 SSH 密鑰添加到 ssh-agent&#xff1a;顯示本地公鑰*把下面這一串生成的公鑰存到github上* 驗證SSH配置是否成功終端跳轉到本地倉庫把http協議改為SSH&#xff08;如果…

關于AI數據分析可行性的初步評估

一、結論&#xff1a;可在部分環節嵌入&#xff0c;無法直接處理大量數據 1.非本地部署的AI應用處理非機密文件沒問題&#xff0c;內部文件要注意數據安全風險。 2.AI&#xff08;指高規格大模型&#xff09;十分適合探索性研究分析&#xff0c;對復雜報告無法全流程執行&…

矩陣分析-淺要理解(深度學習方向)

梯度分析與最優化 在深度學習的任務中&#xff0c;我們所期望的是訓練一個神經網絡&#xff0c;使得預測結果與真實標簽之間的誤差最小化&#xff0c;這可以近似看作是一個提供梯度下降等優化找到全局最優解的凸優化問題。 奇異值分解 在信息工程領域&#xff0c;對數據處理的…

使用DeepSeek+藍耘快速設計網頁簡易版《我的世界》小游戲

前言&#xff1a;如今&#xff0c;借助先進的人工智能模型與便捷的云平臺&#xff0c;即便是新手開發者&#xff0c;也能開啟創意游戲的設計之旅。DeepSeek 作為前沿的人工智能模型&#xff0c;具備強大的功能與潛力&#xff0c;而藍耘智算云平臺則為其提供了穩定高效的運行環境…

固定表頭、首列 —— uniapp、vue 項目

項目實地&#xff1a;也可以在 【微信小程序】搜索體驗&#xff1a;xny.handbook 另一個體驗項目&#xff1a;官網 一、效果展示 二、代碼展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

【學習筆記】Numpy和Tensor的區別

1. NumPy 和 PyTorch Tensor 的格式對比 NumPy 使用的是 numpy.ndarray&#xff0c;而 PyTorch 使用的是 torch.Tensor&#xff0c;兩者的格式在數據存儲和計算方式上有所不同。 NumPy (numpy.ndarray) import numpy as np array np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.…

每天一道算法題【藍橋杯】【在排序數組中查找元素的第一個位置和最后一個位置】

思路 本題為查找左邊界和右邊界的標準模型 查找左邊界 int left 0, right nums.size() - 1, mid 0; //查找左邊界 while (left < right) { mid left (right - left) / 2; if (nums[mid] < target) left mid 1; else right mid; } 查找右邊界 int left 0, r…

Python數據分析之機器學習基礎

Python 數據分析重點知識點 本系列不同其他的知識點講解&#xff0c;力求通過例子讓新同學學習用法&#xff0c;幫助老同學快速回憶知識點 可視化系列&#xff1a; Python基礎數據分析工具數據處理與分析數據可視化機器學習基礎 五、機器學習基礎 了解機器學習概念、分類及…

我與DeepSeek讀《大型網站技術架構》(10)- 維基百科的高性能架構設計分析

目錄 網站整體架構核心組件請求處理流程圖關鍵環節說明 性能優化策略前端優化&#xff1a;攔截 80% 以上請求服務端優化&#xff1a;高性能 PHP 集群后端優化&#xff1a;存儲與緩存極致設計Memcached 持久化連接 性能優化策略對比表 網站整體架構 核心組件 Wikipedia 的架構…

Excel多級聯動下拉菜單設置

1.問題描述 現有數據表如下圖所示&#xff1a; 該表中包括省、市、縣三級目錄。 現要將其整理成數據表模板&#xff0c;如下圖所示&#xff1a; 要求制作成下拉菜單的形式&#xff0c;且每一級目錄的下拉菜單列表要根據上一級目錄的內容來確定。 如上圖所示&#xff0c;只有…

智駕技術全鏈條解析

智駕技術全鏈條解析&#xff08;2025年最新版&#xff09; 智駕技術涵蓋從環境感知到車輛控制的完整閉環&#xff0c;涉及硬件、算法、數據與系統集成等多個領域。以下結合行業最新進展&#xff08;截至2025年3月&#xff09;進行深度拆解&#xff1a; 一、感知技術&#xff1…

SpringMVC執行的流程

SpringMVC 基于 MVC 架構模式&#xff0c;核心流程時前端控制室 DispathcherServlet 統一調度&#xff0c;通過組件協作完成 http 的請求與響應。 對于 dispatchServlet 作為前端請求的控制器&#xff0c;全局的訪問點&#xff0c;首先將根據 URL 調用 HandlerMapping 獲取 Han…

Linux學習(十五)(故障排除(ICMP,Ping,Traceroute,網絡統計,數據包分析))

故障排除是任何 Linux 用戶或管理員的基本技能。這涉及識別和解決 Linux 系統中的問題。這些問題的范圍包括常見的系統錯誤、硬件或軟件問題、網絡連接問題以及系統資源的管理。Linux 中的故障排除過程通常涉及使用命令行工具、檢查系統和應用程序日志文件、了解系統進程&#…

存儲過程和自定義函數在銀行信貸業務中的應用(oracle)

數據校驗和清洗 例如&#xff0c;檢查客戶的年齡是否在合理范圍內&#xff0c;貸款金額是否符合規定的上下限等。 對于不符合規則的數據&#xff0c;可以進行清洗和修正。比如&#xff0c;將空值替換為默認值&#xff0c;或者對錯誤的數據進行糾正。 CREATE OR REPLACE PROC…

指令微調 (Instruction Tuning) 與 Prompt 工程

引言 預訓練語言模型 (PLMs) 在通用語言能力方面展現出強大的潛力。然而&#xff0c;如何有效地引導 PLMs 遵循人類指令&#xff0c; 并輸出符合人類意圖的響應&#xff0c; 成為釋放 PLMs 價值的關鍵挑戰。 指令微調 (Instruction Tuning) 和 Prompt 工程 (Prompt Engineerin…

【c++】反轉字符串

說明 將string類型的字符串本身反轉 用到庫&#xff1a;algorithm 示例代碼 #include <iostream> #include <string> #include <algorithm> using namespace std;int main() {string str "123";reverse(str.begin(), str.end());cout <<…

正則表達式(復習)

文章目錄 一、[]: 一個字符集合二、{}: 重復次數三、特殊符號四、(): 分組五、python代碼示例六、注意 正則表達式(regular expression)描述了一種字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個…