【Spring】初識 Spring AOP(面向切面編程)

目錄

1、介紹AOP

1.1、AOP的定義

1.2、AOP的作用

1.3、AOP的核心概念及術語

2、AOP實現示例

3、@EnableAspectJAutoProxy注解

1、介紹AOP

1.1、AOP的定義

????????AOP(Aspect Orient Programming),直譯過來就是面向切面編程,AOP 是一種編程思想,是面向對象編程(OOP)的一種補充。AOP可以攔截指定的方法并且對方法增強,而且無需侵入到業務代碼中,使業務與非業務處理邏輯分離,比如Spring的事務,通過事務的注解配置,Spring會自動在業務方法中開啟、提交業務,并且在業務處理失敗時,執行相應的回滾策略。

1.2、AOP的作用

作用:AOP 采取橫向抽取機制(動態代理),取代了傳統縱向繼承機制的重復性代碼,其應用主要體現在事務處理、日志管理、權限控制、異常處理等方面。

主要作用是分離功能性需求和非功能性需求,使開發人員可以集中處理某一個關注點或者橫切邏輯,減少對業務代碼的侵入,增強代碼的可讀性和可維護性。

簡單的說,AOP 的作用就是保證開發者在不修改源代碼的前提下,為系統中的業務組件添加某種通用功能。

AOP的經典應用場景有:日志記錄、事務管理、權限驗證、性能監測

AOP可以攔截指定的方法,并且對方法增強,比如:事務、日志、權限、性能監測等增強,而且無需侵入到業務代碼中,使業務與非業務處理邏輯分離。

1.3、AOP的核心概念及術語

目標對象(Target):目標對象指將要被增強(比如增強功能)的對象,或者說被一個或多個切面所通知的對象,即包含主業務邏輯的類的對象,即為目標對象。

可以說要增強的對象(通常會有很多個)就是目標對象

切面(Aspect):指關注點模塊化,這個關注點可能會橫切多個對象。事務管理是企業級Java應用中有關橫切關注點的例子。 在Spring AOP中,切面可以使用通用類基于模式的方式(schema-basedapproach)或者在普通類中以@Aspect注解(@Aspect注解方式)來實現。

可以說增強代碼放入的那個類就叫切面類,由@Aspect注解來標識

通知(Advice):在切面的某個特定的連接點上執行的動作。通知有多種類型,包括“around”,“before” 和“after”等等。通知的類型將在后面詳細了解。許多AOP框架,包括Spring在內,都是以攔截器做通知模型的,并維護著一個以連接點為中心的攔截器鏈。

用來放增強的代碼的那個方法就是通知

  • 環繞通知@Around:可以把代碼增強在目標方法的任意地方,更通用
  • 前置通知@Before:目標方法之前執行
  • 后置通知@After:目標方法之后執行
  • 異常通知@AfterThrowing:目標方法出現了異常執行
  • 返回通知@AfterReturning:目標方法返回值執行

切點(Pointcut):匹配連接點的斷言。通知和切點表達式相關聯,并在滿足這個切點的連接點上運行(例如,當執行某個特定名稱的方法時)。切點表達式如何和連接點匹配是AOP的核心:Spring默認使用Aspectj切點語義。

增強代碼要對哪些類中的哪些方法進行增強,進行切割,指的是被增強的方法,即要切哪些東西。切點表達式

連接點(Join point):在Spring AOP中,一個連接點總是代表一個方法的執行,其實就代表增強的方法。

連接點就是通知和目標方法的一個橋梁,可以獲取到目標方法的信息,就得通過JoinPoint

顧問(Advisor):顧問是Advice的一種包裝體現,Advisor是Pointcut以及Advice的一個結合,用來管理Advice和Pointcut。應用無需關心.

顧問是源碼中的體現,會封裝切點和通知

織入(Weaving):將通知切入連接點的過程叫織入,就是我這個增強代碼織入到目標方法或者叫切入到目標方法都可以

2、AOP實現示例

????????假設有一個類的所有業務功能都已經實現,但是最后我想在所有的功能里面加一個公共的功能(記錄所有的請求的用時), 這時候就可以利用AOP來實現,切面就是(需要增強的公共的、跟業務沒有關系的公共代碼)。可以在不改變原有業務代碼的基礎上進行了增強。所以面向切面編程往往讓我們的開發更加低耦合,也大大減少了代碼量,同時呢讓我們更專注于業務模塊的開發,把那些與業務無關的東西提取出去,便于后期的維護和迭代。

如何在Spring中創建一個所謂切面?

切面里面的代碼怎么運行在業務方法(運行在之前、運行在之后)

使用AOP需要引入依賴

<!--以spring-boot-starter為前綴的依賴都是springboot官方提供的依賴,
不需要自己來指定版本,因為parent都幫我們管理好了,
springboot通過這種方式統一管理了版本,可以減少版本的沖突-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

aspectj:AOP概念并不是spring獨家提出來的,AOP早就有成熟框架已經實現了,aspectj就是一個成熟的AOP的解決方案,spring只不過是把aspectj集成進來了

AOP實現示例代碼:@Aspect注解可以把一個類標記為切面類

自定義類UserService,假設其所有業務功能(增刪查改)都已經實現,但是我想給這些功能加一個記錄請求用時的功能。這時用AOP來實現

//自定義類UserService,假設其所有業務功能都已經實現
@Service
public class UserService {// 增加增刪改查方法,這里就用一個打印語句來代替具體的方法功能了public void add(){System.out.println("增加");}public void delete(){System.out.println("刪除");}public void update(){System.out.println("修改");}public void query(){System.out.println("查詢");}
}//切面類LogAspect,通過這個切面類來實現在所有的功能里面加一個公共的功能(記錄所有的請求的用時)
@Aspect  //把這個類標記為切面類
@Component  //切面類必須聲明為Spring的bean
public class LogAspect, {// execution(* com.lt.UserService.*(..)) 切點表達式// @Around 環繞通知@Around("execution(* com.lt.UserService.*(..))") //切點表達式public void log(ProceedingJoinPoint proceedingJoinPoint){//記錄方法用時long begin = System.currentTimeMillis();// 執行具體的方法try {proceedingJoinPoint.proceed();} catch (Throwable e){System.out.println("方法執行異常:" + e.getMessage());}long end = System.currentTimeMillis();System.out.println("方法用時:" + (end - begin) + "ms");}}//測試類C4AopApplicationTests
@SpringBootTest(classes = C4AopApplicationTests.class)
@ComponentScan
class C4AopApplicationTests {@Testvoid contextLoads(@Autowired UserService userService) {userService.add();}}

運行結果:

3、@EnableAspectJAutoProxy注解

1、@EnableAspectJAutoProxy:啟用AOP,沒有這個注解AOP功能無法使用

如果要使用SpringAOP的功能,必須要添加一個@EnableAspectJAutoProxy注解,有了這個注解才能支持@Aspect等相關的一系列AOP注解的功能,這個注解就相當于在傳統的xml配置文件中添加 <aop:aspectj-autoproxy>一樣。

2、@EnableAspectAutoProxy不是一定要加的

比如上面的AOP示例,為什么沒有加@EnableAspectJAutoProxy注解,AOP也起作用了?

這是因為SpringBoot其實會通過啟動類自動幫我們加上@EnableAspectJAutoProxy,所以可以省略。(@SpringBootApplication這個注解幫我們做了很多的事情,包括自動幫我們加上@EnableAspectJAutoProxy注解)

//測試類C4AopApplicationTests
@SpringBootTest(classes = C4AopApplicationTests.class)
@ComponentScan
class C4AopApplicationTests {......
}//啟動類
@SpringBootApplication // 由于這個注解起了作用,所以自動加了@EnableAspectJAutoProxy
public class C4AopApplication {......
}

所以com.lt包下的啟動類C4AopApplication和他上面的上面的注解@SpringBootApplicatio也會被掃描到,由于這個注解起了作用,所以自動加了@EnableAspectJAutoProxy

但是依然建議加上@EnableAspectJAutoProxy,因為在Spring中沒有這個注解AOP功能會無法使用。

?推薦:

【Spring】IOC/DI中常用的注解@Lazy、@Scope與@Conditional-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138277932?spm=1001.2014.3001.5501

【Spring】IOC/DI中常用的注解@Order與@DependsOn-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138167160?spm=1001.2014.3001.5501

【spring】Bean的生命周期回調函數和Bean的循環依賴-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/138503989?spm=1001.2014.3001.5501

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

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

相關文章

Windows Python 安裝準備

首先安裝配置 1. 環境的安裝和配置: 運行環境: 官方提供了cpython解釋器 編輯環境: 課程初級階段:推薦大家使用: 記事本工具(UE、notepad++、editplus、sublime、vscode) 中期階段IDE的使用,pycharm 2. 安裝python環境: 在官方下載python解釋器 www.python.org …

Ubuntu18.04--虛擬機配置Samba并從Windows登錄

前言&#xff1a; 本文記錄我自己在Windows上安裝 Virtualbox &#xff0c;并在Virtualbox中安裝 Ubuntu-18.04 虛擬機&#xff0c;在Ubuntu-18.04虛擬機里安裝配置Smaba服務器&#xff0c;從 Windows 宿主系統上訪問虛擬機共享samba目錄的配置命令。 引用: N/A 正文 虛擬…

[C++][數據結構]哈希3:unordered_map和unordered_set的模擬實現

前言 今天我們來試著用哈希封裝一下unordered_map和unordered_set這兩個容器 由于主要的哈希的模擬實現都在之前的文章中&#xff0c;所以本文只是對于幾個小問題進行說明 KeyOfT&#xff1a;取出key 因為我們傳的第二個模板參數是T&#xff0c;我們不知道他是key還是pair&l…

Three.js的材質Material信息

Material材質信息,是獨立于物體頂點之外,與渲染效果相關的屬性。比如通過設置材質可以改變物體的顏色、紋理貼圖、光照模式等等。 基本材質【BasicMaterial】 基本材質BasicMaterial的物體,顏色不會因為光照產生明暗、陰影效果。如果沒有指定的材質顏色,那么顏色就是隨機…

協同過濾的一些理解

協同過濾的一些理解 以下是我對協同過濾的一些理解&#xff0c;歡迎來交。 什么是協同過濾 協同過濾&#xff1a;利用相似用戶的行為或相似商品的特征來進行推薦。 協同過濾&#xff08;Collaborative Filtering, CF&#xff09;是推薦系統中一種常用的技術&#xff0c;它基于…

揭秘LLMOps,高效開發大型語言模型

大家好&#xff0c;隨著人工智能&#xff08;AI&#xff09;的蓬勃發展&#xff0c;一個新興領域語言模型運維&#xff08;LLMOps&#xff09;正逐漸成為關注的焦點。LLMOps專注于對大型語言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;進行全…

SpringBoot Actuator未授權訪問漏洞的解決方法

1. 介紹 Spring Boot Actuator 是一個用于監控和管理 Spring Boot 應用程序的功能模塊。它提供了一系列生產就緒的功能&#xff0c;幫助你了解應用程序的運行狀況&#xff0c;以及在運行時對應用程序進行調整。Actuator 使用了 Spring MVC 來暴露各種 HTTP 或 JMX 端點&#x…

【機器學習】卷積神經(CNN)在圖像識別中的革命性應用:自動駕駛的崛起

卷積神經網絡&#xff08;CNN&#xff09;在圖像識別中的革命性應用&#xff1a;自動駕駛的崛起 一、卷積神經網絡&#xff08;CNN&#xff09;的基本原理二、CNN在圖像識別中的顯著成果三、CNN在自動駕駛汽車中的物體檢測和識別四、CNN在圖像識別中的代碼實例 隨著人工智能和深…

輪式機器人簡介

迄今為止,輪子一般是移動機器人學和人造交通車輛中最流行的運動機構。它可達到很高的效率, 如圖所示, 而且用比較簡單的機械就可實現它的制作。 另外,在輪式機器人設計中,平衡通常不是一個研究問題。 因為在所有時間里,輪式機器人一般都被設計成在任何時間里所有輪子均與地接…

大模型系列之解讀MoE

Mixtral 8x7B 的推出&#xff0c; 使我們開始更多地關注 基于MoE 的大模型架構&#xff0c; 那么&#xff0c;什么是MoE呢&#xff1f; 1. MoE溯源 MoE的概念起源于 1991 年的論文 Adaptive Mixture of Local Experts&#xff08;https://www.cs.toronto.edu/~hinton/absps/jjn…

間隔采樣視頻的代碼

項目統計模型準確率 項目會保存大量視頻&#xff0c;為了統計模型的精度&#xff0c;我們想要十五分鐘抽取一個視頻用來統計。 import os import shutil from datetime import datetime, timedelta #抽取視頻的代碼&#xff0c;會在每個小時的0分、15分、30分、45分取一個命名…

c++ 和c回調混合的一種實現

代碼 #include <iostream> #include <list>using namespace std; struct CallbackBase { virtual void operator()(const char* msg,int len) 0; };void messagesCB(const char* msg,int len) {std::cout<<msg<<" "<<len<<std…

中國土壤類型空間分布數據

中國土壤類型空間分布數據根據全國土壤普查辦公室1995年編制并出版的《1&#xff1a;100萬中華人民共和國土壤圖》數字化生成&#xff0c; 采用了傳統的“土壤發生分類”系統&#xff0c;基本制圖單元為亞類&#xff0c;共分出12土綱&#xff0c;61個土類&#xff0c;227個亞類…

JavaScript原理篇——Promise原理及筆試題實戰演練

Promise 是 JavaScript 中用于處理異步操作的對象&#xff0c;它代表了一個可能還沒有完成的操作的最終完成或失敗&#xff0c;以及其結果值。Promise 對象有三種狀態&#xff1a; Pending&#xff08;進行中&#xff09;&#xff1a;初始狀態&#xff0c;既不是成功&#xff0…

JavaScript BOM - 瀏覽器對象模型

BOM&#xff08;瀏覽器對象模型&#xff09;是JavaScript中與瀏覽器交互的一組API&#xff0c;它提供了一種方法來操作瀏覽器窗口和文檔。BOM由一組對象組成&#xff0c;這些對象允許您訪問瀏覽器本身的功能&#xff0c;而不僅僅是網頁內容。 BOM對象包括&#xff1a; window對…

融知財經:期貨和現貨的區別是什么?哪個風險大?

期貨和現貨在交易對象等方面存在明顯的區別。期貨交易是一種衍生金融工具&#xff0c;主要用于價格發現、風險管理和投機&#xff0c;而現貨交易則是商品和服務的實際買賣。在選擇進行期貨交易還是現貨交易時&#xff0c;投資者需要根據自己的需求和市場情況來決定。 期貨和現貨…

二叉搜索樹 題解 二叉搜索樹的構建 DFS

二叉搜索樹 題目描述 判斷兩序列是否為同一個二叉搜索樹序列。 輸入描述 第一行是一個數 n ( 1 < n < 20 )&#xff0c;表示有 n 個二叉搜索樹序列需要判斷。 接下去一行是一個序列&#xff0c;序列長度小于 10 &#xff0c;包含 0 ~ 9 的數字&#xff0c;沒有重復數…

【Android】Kotlin學習之Lambda表達式

java和kotlin對比 Lambda語法 Lambda隱形參數 it 也可以不使用指定的名稱it, 可以 自定義 Lambda 使用下劃線

原來Python處理word這么簡單:關于python操作文檔的問題

關于python操作文檔的問題 文檔類型&#xff1a;docx 語言&#xff1a;python 我想在文檔中姓名后面的下劃線之上插入一個姓名&#xff0c;并保存為新的文檔&#xff0c; 用python應該怎么實現呢 文檔見下圖 一般情況下&#xff0c;我們在看到題目的時候&#xff0c;應該先審題…

PHP+B/S架構 不良事件管理系統源碼 醫院不良事件報告系統源碼,開發技術vue2+element+laravel8

PHPB/S架構 不良事件管理系統源碼 醫院不良事件報告系統源碼&#xff0c;開發技術vue2elementlaravel8 技術架構&#xff1a;前后端分離&#xff0c;倉儲模式&#xff0c;BS架構&#xff0c; 開發技術&#xff1a;PHPvscodevue2elementlaravel8mysql5.7&#xff0c;專業團隊研…