Spring的AOP基礎以及AOP的核心概念

2. AOP基礎

學習完spring的事務管理之后,接下來我們進入到AOP的學習。 AOP也是spring框架的第二大核心,我們先來學習AOP的基礎。

在AOP基礎這個階段,我們首先介紹一下什么是AOP,再通過一個快速入門程序,讓大家快速體驗AOP程序的開發。最后再介紹AOP當中所涉及到的一些核心的概念。

2.1 AOP概述

什么是AOP?

  • AOP英文全稱:Aspect Oriented Programming(面向切面編程、面向方面編程),其實說白了,面向切面編程就是面向特定方法編程。

那什么又是面向方法編程呢,為什么又需要面向方法編程呢?來我們舉個例子做一個說明:

比如,我們這里有一個項目,項目中開發了很多的業務功能。

在這里插入圖片描述

然而有一些業務功能執行效率比較低,執行耗時較長,我們需要針對于這些業務方法進行優化。 那首先第一步就需要定位出執行耗時比較長的業務方法,再針對于業務方法再來進行優化。

此時我們就需要統計當前這個項目當中每一個業務方法的執行耗時。那么統計每一個業務方法的執行耗時該怎么實現?

可能多數人首先想到的就是在每一個業務方法運行之前,記錄這個方法運行的開始時間。在這個方法運行完畢之后,再來記錄這個方法運行的結束時間。拿結束時間減去開始時間,不就是這個方法的執行耗時嗎? 在這里插入圖片描述

以上分析的實現方式是可以解決需求問題的。但是對于一個項目來講,里面會包含很多的業務模塊,每個業務模塊又包含很多增刪改查的方法,如果我們要在每一個模塊下的業務方法中,添加記錄開始時間、結束時間、計算執行耗時的代碼,就會讓程序員的工作變得非常繁瑣。

在這里插入圖片描述

而AOP面向方法編程,就可以做到在不改動這些原始方法的基礎上,針對特定的方法進行功能的增強。

AOP的作用:在程序運行期間在不修改源代碼的基礎上對已有方法進行增強(無侵入性: 解耦)

我們要想完成統計各個業務方法執行耗時的需求,我們只需要定義一個模板方法,將記錄方法執行耗時這一部分公共的邏輯代碼,定義在模板方法當中,在這個方法開始運行之前,來記錄這個方法運行的開始時間,在方法結束運行的時候,再來記錄方法運行的結束時間,中間就來運行原始的業務方法。

在這里插入圖片描述

而中間運行的原始業務方法,可能是其中的一個業務方法,比如:我們只想通過 部門管理的 list 方法的執行耗時,那就只有這一個方法是原始業務方法。 而如果,我們是先想統計所有部門管理的業務方法執行耗時,那此時,所有的部門管理的業務方法都是 原始業務方法。 那面向這樣的指定的一個或多個方法進行編程,我們就稱之為 面向切面編程。

那此時,當我們再調用部門管理的 list 業務方法時啊,并不會直接執行 list 方法的邏輯,而是會執行我們所定義的 模板方法 , 然后再模板方法中:

  • 記錄方法運行開始時間
  • 運行原始的業務方法(那此時原始的業務方法,就是 list 方法)
  • 記錄方法運行結束時間,計算方法執行耗時

在這里插入圖片描述

不論,我們運行的是那個業務方法,最后其實運行的就是我們定義的模板方法,而在模板方法中,就完成了原始方法執行耗時的統計操作 。(那這樣呢,我們就通過一個模板方法就完成了指定的一個或多個業務方法執行耗時的統計)

而大家會發現,這個流程,我們是不是似曾相識啊?

對了,就是和我們之前所學習的動態代理技術是非常類似的。 我們所說的模板方法,其實就是代理對象中所定義的方法,那代理對象中的方法以及根據對應的業務需要, 完成了對應的業務功能,當運行原始業務方法時,就會運行代理對象中的方法,從而實現統計業務方法執行耗時的操作。

其實,AOP面向切面編程和OOP面向對象編程一樣,它們都僅僅是一種編程思想,而動態代理技術是這種思想最主流的實現方式。而Spring的AOP是Spring框架的高級技術,旨在管理bean對象的過程中底層使用動態代理機制,對特定的方法進行編程(功能增強)。

AOP的優勢:

  1. 減少重復代碼
  2. 提高開發效率
  3. 維護方便

2.2 AOP快速入門

在了解了什么是AOP后,我們下面通過一個快速入門程序,體驗下AOP的開發,并掌握Spring中AOP的開發步驟。

**需求:**統計各個業務層方法執行耗時。

實現步驟:

  1. 導入依賴:在pom.xml中導入AOP的依賴
  2. 編寫AOP程序:針對于特定方法根據業務需要進行編程

為演示方便,可以自建新項目或導入提供的springboot-aop-quickstart項目工程

pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

AOP程序:TimeAspect

@Component
@Aspect //當前類為切面類
@Slf4j
public class TimeAspect {@Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//記錄方法執行開始時間long begin = System.currentTimeMillis();//執行原始方法Object result = pjp.proceed();//記錄方法執行結束時間long end = System.currentTimeMillis();//計算方法執行耗時log.info(pjp.getSignature()+"執行耗時: {}毫秒",end-begin);return result;}
}

重新啟動SpringBoot服務測試程序:

  • 查詢3號部門信息

在這里插入圖片描述

在這里插入圖片描述

我們可以再測試下:查詢所有部門信息(同樣執行AOP程序)

在這里插入圖片描述

我們通過AOP入門程序完成了業務方法執行耗時的統計,那其實AOP的功能遠不止于此,常見的應用場景如下:

  • 記錄系統的操作日志
  • 權限控制
  • 事務管理:我們前面所講解的Spring事務管理,底層其實也是通過AOP來實現的,只要添加@Transactional注解之后,AOP程序自動會在原始方法運行前先來開啟事務,在原始方法運行完畢之后提交或回滾事務

這些都是AOP應用的典型場景。

通過入門程序,我們也應該感受到了AOP面向切面編程的一些優勢:

  • 代碼無侵入:沒有修改原始的業務方法,就已經對原始的業務方法進行了功能的增強或者是功能的改變

  • 減少了重復代碼

  • 提高開發效率

  • 維護方便

2.3 AOP核心概念

通過SpringAOP的快速入門,感受了一下AOP面向切面編程的開發方式。下面我們再來學習AOP當中涉及到的一些核心概念。

1. 連接點:JoinPoint,可以被AOP控制的方法(暗含方法執行時的相關信息)

? 連接點指的是可以被aop控制的方法。例如:入門程序當中所有的業務方法都是可以被aop控制的方法。

? 在這里插入圖片描述

? 在SpringAOP提供的JoinPoint當中,封裝了連接點方法在執行時的相關信息。(后面會有具體的講解)

2. 通知:Advice,指哪些重復的邏輯,也就是共性功能(最終體現為一個方法)

? 在入門程序中是需要統計各個業務方法的執行耗時的,此時我們就需要在這些業務方法運行開始之前,先記錄這個方法運行的開始時間,在每一個業務方法運行結束的時候,再來記錄這個方法運行的結束時間。

? 但是在AOP面向切面編程當中,我們只需要將這部分重復的代碼邏輯抽取出來單獨定義。抽取出來的這一部分重復的邏輯,也就是共性的功能。

在這里插入圖片描述

3. 切入點:PointCut,匹配連接點的條件,通知僅會在切入點方法執行時被應用

? 在通知當中,我們所定義的共性功能到底要應用在哪些方法上?此時就涉及到了切入點pointcut概念。切入點指的是匹配連接點的條件。通知僅會在切入點方法運行時才會被應用。

? 在aop的開發當中,我們通常會通過一個切入點表達式來描述切入點(后面會有詳解)。

? 在這里插入圖片描述

? 假如:切入點表達式改為DeptServiceImpl.list(),此時就代表僅僅只有list這一個方法是切入點。只有list()方法在運行的時候才會應用通知。

?

4. 切面:Aspect,描述通知與切入點的對應關系(通知+切入點)

? 當通知和切入點結合在一起,就形成了一個切面。通過切面就能夠描述當前aop程序需要針對于哪個原始方法,在什么時候執行什么樣的操作。 在這里插入圖片描述

? 切面所在的類,我們一般稱為切面類(被@Aspect注解標識的類)

?

5. 目標對象:Target,通知所應用的對象

? 目標對象指的就是通知所應用的對象,我們就稱之為目標對象。

? 在這里插入圖片描述

AOP的核心概念我們介紹完畢之后,接下來我們再來分析一下我們所定義的通知是如何與目標對象結合在一起,對目標對象當中的方法進行功能增強的。

在這里插入圖片描述

Spring的AOP底層是基于動態代理技術來實現的,也就是說在程序運行的時候,會自動的基于動態代理技術為目標對象生成一個對應的代理對象。在代理對象當中就會對目標對象當中的原始方法進行功能的增強。

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

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

相關文章

Ubuntu配置GitHub(第一次clone/push)

文章目錄 1. 安裝Git&檢查連接2. 注冊GitHub3. 生成&GitHub添加SSH3.1. 檢查&刪除已有id_rsa3.2. 生成SSH3.3. GitHub添加id_rsa.pub SSH3.4. 檢查SSH 4. 繼續開發可以參考參考 1. 安裝Git&檢查連接 安裝 sudo apt-get install git檢查SSH連接 ssh -T gitgi…

【工具分享】零零信安攻擊面管理平臺

文章目錄 00SEC-ASM?功能介紹功能演示 最近閑來無事&#xff0c;到處網上沖浪&#xff0c;無意間發現了長亭云圖攻擊面管理平臺&#xff0c;無奈需要授權才能使用&#xff0c;于是就找到了平替&#xff1a;零零信安攻擊面管理平臺。 長亭云圖攻擊面管理平臺&#xff1a;https:…

vue2封裝向上滾動組件

目錄 1.代碼2.使用 1.代碼 <template><div class"marquee-wrap" :style"{height: height px}"><ul class"marquee-list":style"animateUpStyle"v-on:mouseover"myMouseover"v-on:mouseout"myMouseout…

工廠方法模式在金融業務中的應用及其框架實現

引言 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它定義了一個創建對象的接口&#xff0c;但由子類決定實例化哪一個類。工廠方法模式使得類的實例化延遲到子類。在金融業務中&#xff0c;工廠方法模式可以用于創建不同類型…

惠普Z系列AI臺式工作站家族

聚焦智能制造、數據科學及人工智能、3D圖形圖像等高精尖領域&#xff0c;為客戶提供高性能、強穩定、強拓展的臺式工作站產品及解決方案。 HP Z1 Tower G9 VR創作 / 設計建模 適用于VR內容創作及設計建模等工作可支持128G DDR5內存&#xff0c;第十四代Intel Core? vPro? CPU…

Windows下cmd快速到達指定文件位置(三種方法)

一、圖形界面 第一步&#xff1a; 點擊此圖標 在搜索框輸入“cmd”&#xff0c;打開命令提示符 或者&#xff1a; 快捷鍵windowR&#xff0c;點擊“確定” 第二步&#xff1a; 先進盤 比如d盤&#xff0c;輸入 d: &#xff08;注意英文輸入法&#xff09;&#xff0c;再進文件…

前沿重器[53] | 聊聊搜索系統6:精排

前沿重器 欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

充分利用視覺信息多問多答合成數據,提升多模態大模型數學推理能力

©PaperWeekly 原創 作者 | 史文浩 單位 | 電子科技大學 論文題目&#xff1a; Math-LLaVA: Bootstrapping Mathematical Reasoning for Multimodal Large Language Models 論文鏈接&#xff1a; https://arxiv.org/abs/2406.17294 開源鏈接&#xff1a; https://github.c…

最新國內免費使用GPT4o、4.0、3.5 的方法

為了方便大家對GPT有更好的了解&#xff0c;這里特地整理了一個表格做對比 這些模型展示了OpenAI在自然語言處理領域的持續進步&#xff0c;每一代模型都在理解和生成能力、效率和適用性方面進行了顯著提升。 網站匯總 這里順便給大家匯總一下國內同類型的網站&#xff0c;有…

物聯網設計競賽_10_Jetson Nano中文轉漢語語音

在windows中pyttsx3可以讓漢字文本輸出中文語音&#xff0c;但是在jetson上只能用英文說話 import pyttsx3def hanyu(test):engine pyttsx3.init()rate engine.getProperty(rate)engine.setProperty(rate,125)engine.say(test)engine.runAndWait() hanyu(你好) #engine.save…

qt 按鈕鏈接一個槽函數

在Qt中&#xff0c;按鈕&#xff08;比如QPushButton&#xff09;可以通過信號和槽的機制來連接到一個槽函數。這樣&#xff0c;當按鈕被點擊時&#xff0c;槽函數就會被執行。下面是如何將一個按鈕鏈接到一個槽函數的基本步驟&#xff1a; 創建按鈕和槽函數&#xff1a; 創建…

每日一練全新考試模式解鎖|考試升級

&#x1f64b;頻繁有小伙伴咨詢&#xff1a;我想舉辦一場歷時一個月的答題活動&#xff0c;學生可以每天打開答題&#xff0c;活動完結后可以導出每天的答題成績 此前我們都會讓小伙伴創建30場考試&#xff0c;然后使用批量分享功能組合起來&#xff0c;對外分享一個鏈接就可以…

【chatgpt消費者偏好】是什么驅動了游客持續旅游意愿?推文分享—2024-07-08

今天推文的主題是【chatgpt&消費者意愿】 第一篇&#xff1a;文章主要研究了什么因素驅動旅游者繼續使用ChatGPT進行旅行服務&#xff0c;并從人類擬態的角度探討了旅游者對ChatGPT的感知和使用意圖。第二篇&#xff1a;本文探討了ChatGPT-4在生成針對TripAdvisor上發布的…

速盾:cdn防御cc

CDN&#xff08;Content Delivery Network&#xff09;是指在分布式網絡中分布服務器群&#xff0c;通過就近訪問用戶、提供快速可靠的內容傳輸與加速服務。而CC&#xff08;Challenge Collapsar&#xff09;攻擊則是一種常見的網絡攻擊手段&#xff0c;通過發送大量的請求來超…

基于門控循環單元 GRU 實現股票單變量時間序列預測(PyTorch版)

前言 系列專欄:【深度學習&#xff1a;算法項目實戰】?? 涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域&#xff0c;討論了各種復雜的深度神經網絡思想&#xff0c;如卷積神經網絡、循環神經網絡、生成對…

GEE代碼實例教程詳解:地形分析

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對特定區域內的地形進行分析。我們將使用SRTM&#xff08;Shuttle Radar Topography Mission&#xff09;數據集獲取高程信息&#xff0c;并計算坡度、坡向等地形屬性。此外&#xff0c;我們還將使用ALOS&a…

# 昇思25天學習打卡營第10天 | 使用靜態圖加速

昇思25天學習打卡營第10天 | 使用靜態圖加速 文章目錄 昇思25天學習打卡營第10天 | 使用靜態圖加速動態圖的開啟方式靜態圖的開啟方式基于全局context的開啟方式基于修飾器的開啟方式 總結打卡 AI編譯框架分為兩種運行模式&#xff1a; 動態圖模式&#xff1a; 計算圖的構建和計…

讀人工智能全傳07智能體

1. 布魯克斯革命 1.1. 隨著科學認知的發展&#xff0c;有時候舊有科學體系會面臨全盤崩潰的危機&#xff0c;新的科學體系誕生&#xff0c;取代傳統的、既定的科學體系&#xff0c;這就意味著科學的范式將發生變化 1.2. 澳大利亞機器人學家羅德尼布魯克斯(Rodney Brooks)&…

DS1302實時時鐘芯片_讀寫時間實現電子鐘功能

一、前言 1.1 功能說明 本項目以STC90C51單片機為核心&#xff0c;結合DS1302實時時鐘芯片和IIC協議的OLED顯示屏&#xff0c;設計了一款功能豐富、操作簡便的電子時鐘。 【1】項目目標 實現高精度的時間顯示&#xff0c;包括時、分、秒。提供按鍵調整時間的功能&#xff0…

fatal error: NvInfer.h: No such file or directory 的參考解決方法

文章目錄 寫在前面一、問題描述二、解決方法參考鏈接 寫在前面 自己的測試環境&#xff1a; Ubuntu20.04 一、問題描述 編譯調用 tensorrt 的程序時&#xff0c;出現如下報錯&#xff1a; fatal error: NvInfer.h: No such file or directory7 | #include <NvInfer.h>…