【Spring教程15】Spring框架實戰:詳解解讀AOP的工作流程和AOP的核心概念

目錄

  • 1 AOP工作流程
  • 2 AOP核心概念

歡迎大家回到《 Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現,如果您對Maven還很陌生,請移步本人的博文《 如何在windows11下安裝Maven并配置以及 IDEA配置Maven環境》,本文的上一篇為《 AOP入門案例實戰詳解》

在這里插入圖片描述
AOP的入門案例已經完成,對于剛才案例的執行過程,我們就得來分析分析,這一節我們主要講解兩個知識點: AOP工作流程和AOP核心概念。其中核心概念是對前面核心概念的補充。

1 AOP工作流程

由于AOP是基于Spring容器管理的bean做的增強,所以整個工作過程需要從Spring加載bean說起:

流程1:Spring容器啟動

  • 容器啟動就需要去加載bean,哪些類需要被加載呢?
  • 需要被增強的類,如:BookServiceImpl
  • 通知類,如:MyAdvice
  • 注意此時bean對象還沒有創建成功

流程2:讀取所有切面配置中的切入點
在這里插入圖片描述

  • 上面這個例子中有兩個切入點的配置,但是第一個ptx()并沒有被使用,所以不會被讀取。

流程3:初始化bean

判定bean對應的類中的方法是否匹配到任意切入點

  • 注意第1步在容器啟動的時候,bean對象還沒有被創建成功。
  • 要被實例化bean對象的類中的方法和切入點進行匹配
    在這里插入圖片描述
    • 匹配失敗,創建原始對象,如UserDao
      • 匹配失敗說明不需要增強,直接調用原始對象的方法即可。
    • 匹配成功,創建原始對象(目標對象)的代理對象,如: BookDao
      • 匹配成功說明需要對其進行增強
      • 對哪個類做增強,這個類對應的對象就叫做目標對象
      • 因為要對目標對象進行功能增強,而采用的技術是動態代理,所以會為其創建一個代理對象
      • 最終運行的是代理對象的方法,在該方法中會對原始方法進行功能增強

流程4:獲取bean執行方法

  • 獲取的bean是原始對象時,調用方法并執行,完成操作
  • 獲取的bean是代理對象時,根據代理對象的運行模式運行原始方法與增強的內容,完成操作驗證容器中是否為代理對象

為了驗證IOC容器中創建的對象和我們剛才所說的結論是否一致,首先先把結論理出來:

  • 如果目標對象中的方法會被增強,那么容器中將存入的是目標對象的代理對象
  • 如果目標對象中的方法不被增強,那么容器中將存入的是目標對象本身。

驗證思路

1.要執行的方法,不被定義的切入點包含,即不要增強,打印當前類的getClass()方法
2.要執行的方法,被定義的切入點包含,即要增強,打印出當前類的getClass()方法
3.觀察兩次打印的結果

步驟1:修改App類,獲取類的類型

public class App {public static void main(String[] args) {ApplicationContext ctx = newAnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao = ctx.getBean(BookDao.class);System.out.println(bookDao);System.out.println(bookDao.getClass());}
}

步驟2:修改MyAdvice類,不增強
因為定義的切入點中,被修改成update1 ,所以BookDao中的update方法在執行的時候,就不會被增
強,所以容器中的對象應該是目標對象本身。

@Component
@Aspect
public class MyAdvice {@Pointcut("execution(void com.itheima.dao.BookDao.update1())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}

步驟3:運行程序

在這里插入圖片描述
步驟4:修改MyAdvice類,增強
因為定義的切入點中,被修改成update ,所以BookDao中的update方法在執行的時候,就會被增
強,所以容器中的對象應該是目標對象的代理對象

@Component
@Aspect
public class MyAdvice {@Pointcut("execution(void com.itheima.dao.BookDao.update())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}

步驟5:運行程序
在這里插入圖片描述
至此對于剛才的結論,我們就得到了驗證,這塊大家需要注意的是:
不能直接打印對象,從上面兩次結果中可以看出,直接打印對象走的是對象的toString方法,不管是不是代理對象打印的結果都是一樣的,原因是內部對toString方法進行了重寫。

2 AOP核心概念

在上面介紹AOP的工作流程中,我們提到了兩個核心概念,分別是:

  • 目標對象(Target):原始功能去掉共性功能對應的類產生的對象,這種對象是無法直接完成最終工作的
  • 代理(Proxy):目標對象無法直接完成工作,需要對其進行功能回填,通過原始對象的代理對象實現

上面這兩個概念比較抽象,簡單來說,
目標對象就是要增強的類[如:BookServiceImpl類]對應的對象,也叫原始對象,不能說它不能運
行,只能說它在運行的過程中對于要增強的內容是缺失的。

SpringAOP是在不改變原有設計(代碼)的前提下對其進行增強的,它的底層采用的是代理模式實現
的,所以要對原始對象進行增強,就需要對原始對象創建代理對象,在代理對象中的方法把通知
[如:MyAdvice中的method方法]內容加進去,就實現了增強,這就是我們所說的代理(Proxy)。

小結

通過這一節中,我們需要掌握的內容有:

  • 能說出AOP的工作流程
  • AOP的核心概念
    • 目標對象、連接點、切入點
    • 通知類、通知
    • 切面
    • 代理
  • SpringAOP的本質或者可以說底層實現是通過代理模式。

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

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

相關文章

如何使用cpolar+Inis在Ubuntu系統快速搭建本地博客網站公網可訪問

文章目錄 前言1. Inis博客網站搭建1.1. Inis博客網站下載和安裝1.2 Inis博客網站測試1.3 cpolar的安裝和注冊 2. 本地網頁發布2.1 Cpolar臨時數據隧道2.2 Cpolar穩定隧道(云端設置)2.3.Cpolar穩定隧道(本地設置) 3. 公網訪問測試總…

AspNetCore 中使用 Knife4jUI 更加友好的Swagger界面

🚀介紹 aspnetcore.knife4j是一個基于.NET Core平臺的Swagger UI庫,它提供了API文檔的生成和管理功能。這個庫的前身是swagger-bootstrap-ui,在Java項目中廣泛使用,由于其優秀的界面和易用性被許多開發者所推崇。現在&#xff0c…

LV.13 D2 開發板啟動流程 學習筆記

一、開發板啟動過程 EMMC:相當于電腦的外存,斷電不丟失 開發板上電后首先運行SOC內部iROM中固化的代碼(BL0),這段代碼先對基本的軟硬件環境(時鐘等...)進行初始化,然后再檢測撥碼開關位置獲取啟動方式,然后再將對應存儲…

基于SSM+MySQL學生宿舍管理系統的設計與實現(源碼+數據庫+文檔)

摘 要 近年來,隨著計算機技術的不斷發展和運用,許多實際問題都得到了較好地解決。隨著現代社會對企業經營的需求日益增長,企業的無紙辦公也逐漸得到了推廣。本學生宿舍管理系統的設計開發,目標就是解決宿舍管理復雜的人為管理&a…

PHP變量用{}的使用方法

{} 可以將變量名稱作為一個整體使用 "666666".$id."888888"; //可以簡化為如下 "666666{$id}888888"; //當然$id也可以用$ids[$id] 參考: PHP 大括號{} 的使用_php 函數放在{}-CSDN博客

[23] Self-conditioned Image Generation via Generating Representations

[paper | code] 用生成對象本身作為控制信號,實現無條件圖像生成。訓練階段。Step1:用預訓練模型(例如:Moco v3)提取生成對象的特征編碼;Step2:基于特征編碼,訓練一個擴散模型RDM&a…

pycharm手動安裝包

1.下載對應的包 TTS PyPI 2.手動解壓,找到文件放到pycharm對應項目的lib文件夾中 以TTS包為例,找到下載并解壓的包中的2個文件,一個名稱一個info結尾 3.放到項目的lib文件夾中 eg:路徑;C:\doc\myProject\speaker\venv…

前端知識(十四)——淺談用戶體驗測試的主要功能

用戶體驗(User Experience,簡稱UX)在現代軟件和產品開發中變得愈發重要。為了確保產品能夠滿足用戶期望,提高用戶滿意度,用戶體驗測試成為不可或缺的環節。本文將詳細探討用戶體驗測試的主要功能,以及它在產品開發過程中的重要性 …

Android View的 getHeight 和 getMeasuredHeight 的區別

前言 先簡單復習一下Android View 的 繪制順序: 1、onMeasure(測量),先根據構造器傳進來的LayoutParams(布局參數),測量view寬高。 2、onLayout(布局),再根…

SQL進階 | 自連接

概述 SQL的自連接是指在一個SQL表中,使用自身表格中的實例進行聯接并查詢的操作。自連接通常使用別名來標識一個表格,在自連接中,表格被視為兩個不同的表格,并分別用不同的別名來標識。然后,在WHERE子句中使用這些別名…

oracle異常:ORA-03297:文件包含在請求的 RESIZE 值以外使用的數據

出現這個問題&#xff0c;主要是在對表空間擴容的時候&#xff0c;擴容的大小<實際數據文件大小 1、擴容的語句 alter database datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\USER.DBF resize 2G; 2、若何確定擴容大小是否比實際文件大 根據路徑找到文件&#xff0c;查看…

二十、FreeRTOS之Tickless低功耗模式

本節需要掌握以下內容&#xff1a; 1&#xff0c;低功耗模式簡介&#xff08;了解&#xff09; 2&#xff0c; Tickless模式詳解&#xff08;熟悉&#xff09; 3&#xff0c; Tickless模式相關配置項&#xff08;掌握&#xff09; 4&#xff0c;Tickless低功耗模式實驗&…

自定義異步任務管理器和線程

import com.lancoo.common.utils.Threads; import com.lancoo.common.utils.spring.SpringUtils;import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** 異步任務管理器* * author lancoo*/ public c…

操作系統大會 openEuler Summit 2023即將召開,亮點不容錯過

【12月11日&#xff0c;北京】數字化、智能化浪潮正奔涌而來。操作系統作為數字基礎設施的底座&#xff0c;已經成為推動產業數字化、智能化發展的核心力量&#xff0c;為數智未來提供無限可能。12月15-16日&#xff0c;以“崛起數字時代 引領數智未來”為主題的操作系統大會 &…

〖Python網絡爬蟲實戰?〗- 極驗滑塊介紹(四)

訂閱&#xff1a;新手可以訂閱我的其他專欄。免費階段訂閱量1000 python項目實戰 Python編程基礎教程系列&#xff08;零基礎小白搬磚逆襲) 說明&#xff1a;本專欄持續更新中&#xff0c;訂閱本專欄前必讀關于專欄〖Python網絡爬蟲實戰〗轉為付費專欄的訂閱說明作者&#xff1…

【ArcGIS Pro微課1000例】0049:根據坐標快速定位(創建點位)的常見方法

文章目錄 一、轉到XY1. 閃爍位置2. 平移3. 標記位置二、定位1. 坐標定位2. 添加到圖形3. 添加至要素類三、添加XY坐標四、創建點要素一、轉到XY 舉例:經緯度坐標:113.2583286東, 23.1492340北 。 1. 閃爍位置 輸入坐標,點擊閃爍位置工具,即可在對應的位置出現一個綠色閃爍…

SQL注入漏洞利用

預計更新SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

shiro入門demo

搭建springboot項目&#xff0c;引入以下依賴&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--單元測試--><depe…

集的增刪操作

集是可以修改的&#xff0c;增加元素可以用add和update函數。刪除可以用pop、discard、remove等函數。 1 增加集里的元素 add函數的參數視為一個整體插入到集里&#xff0c;而update函數傳入的參數是把要傳入的元素拆分&#xff0c;做為個體傳入到集合中。 s set("hell…

.9.png的創建

1、創建.9.png 選中圖片&#xff0c;右擊&#xff0c;選擇Create 9-Patch file&#xff0c;點擊確定會生成一個xxx.9.png的圖片 2、繪制拉伸區域 在圖片的最外邊界繪制拉伸區域&#xff0c;按住鼠標左鍵不放&#xff0c;繪制完成后保存就可以使用了。繪制結果示意如下&…