Spring AOP在業務中常見的使用方式

目錄

1、動態代理

1.1、jdk動態代理

1.2、cglib動態代理

1.3、動態代理的好處

2、什么是AOP

2.1、AOP常用術語

2.2、切面的構成

3、使用aspectJ框架實現AOP

3.1、aspectJ簡介

聲明實現類ServiceImpl

聲明切面

3.3、@AfterReturning后置通知

切面類代碼

3.4、@Around環繞通知(功能最強的通知)


1、動態代理

1.1、jdk動態代理

使用jdk中的Proxy,Method,InvocaitonHanderl創建代理對象。 jdk動態代理要求目標類必須實現接口,關于細節本文就不贅述了。
要求:

必須要有接口
目標類必須實現接口(一個或多個)

1.2、cglib動態代理

第三方的工具庫,創建代理對象,原理是繼承。 通過繼承目標類,創建子類。子類就是代理對象。 要求目標類不能是final的,方法也不能是final的

1.3、動態代理的好處

在目標類源代碼不改變的情況下,增加功能。
減少代碼的重復
專注業務邏輯代碼
解耦合,讓你的業務功能和日志,事務非業務功能分離。

2、什么是AOP

面向切面編程, 基于動態代理的,可以使用jdk,cglib兩種代理方式。Aop就是動態代理的規范化, 把動態代理的實現步驟,方式都定義好了, 讓開發人員用一種統一的方式,使用動態代理實現。

2.1、AOP常用術語

Aspect: 切面,給你的目標類增加的功能,就是切面。 像日志,事務都是切面。切面的特點: 一般都是非業務方法,獨立使用的。
JoinPoint:連接點 ,連接業務方法和切面的位置。需要給哪個方法增加切面,這個方法就是連接點。
Pointcut : 切入點 ,指多個連接點方法的集合。
目標對象: 給哪個類的方法增加功能, 這個類就是目標對象。
Advice:通知,通知表示切面功能執行的時間。

2.2、切面的構成

切面就是要給別的方法進行增強的方法,一個切面有以下三個要素。

切面的功能代碼,切面干什么
切面的執行位置,使用Pointcut表示切面執行的位置
切面的執行時間,使用Advice表示時間,在目標方法之前,還是目標方法之后。

3、使用aspectJ框架實現AOP

3.1、aspectJ簡介

aspectJ是一個開源的專門做aop的框架。spring框架中集成了aspectj框架,通過spring就能使用aspectj的功能。aspectJ框架實現aop有兩種方式:

使用xml的配置文件 : 配置全局事務
使用注解,我們在項目中要做aop功能,一般都使用注解, aspectj有5個注解。
再使用aspectJ做aop之前要先加入aspectJ依賴。

    <!--aspectJ依賴--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.5.RELEASE</version></dependency>

3.2 @Before前置通知
前置通知注解修飾的切面在連接點方法之前執行。下面通過一段代碼體驗一下。

聲明接口IService

public interface IService {void doSome(String name, int age);
}

聲明實現類ServiceImpl

public class ServiceImpl implements IService {@Overridepublic void doSome(String name, int age) {System.out.println("===doSome()===");}
}

聲明切面

@Aspect
public class MyAspectJ {/*** 定義功能增強方法(方法就是切面)* 1、方法的必須為public* 2、方法無返回值* 3、方法名稱自定義* 4、方法可以有參數,也可以沒有參數* 5、方法的定義上方加入注解,表示切入點的執行時機@Before(value = "execution(public void com.mms.ba01.ServiceImpl.doSome(String,int))")public void beforeLog() {System.out.println("前置通知->系統當前時間:" + new Date());}*//*前置通知,帶方法參數的切面切面方法有參數時要求參數是JoinPoint類型,參數名自定義,該參數就代表了連接點方法,即doSome方法使用該參數可以獲取切入點表達式、切入點方法簽名、目標對象等*/@Before(value = "execution(* *..ServiceImpl.doSome(..))")public void beforeLog(JoinPoint jp) {System.out.println("連接點方法的方法簽名="+jp.getSignature());System.out.println("連接點方法的方法名="+jp.getSignature().getName());//獲取連接點方法參數Object[] args = jp.getArgs();for (Object arg : args) {System.out.println("arg="+arg);}}
}

測試

public class MyTest {//aop前置通知@Testpublic void test01() {String config = "ba01/applicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(config);//獲取目標對象,此時的service就是spring生成的代理對象//注意返回值類型是接口類型,不能是實現類接口,否則報錯IService service = (IService) ac.getBean("service");//使用代理對象執行方法service.doSome("張三",23);}
}

3.3、@AfterReturning后置通知

在IService接口中新增方法:

Student doStudent(Student student);

在ServiceImpl實現doStudent方

    @Overridepublic Student doStudent(Student student) {return student;}

切面類代碼

@Aspect
public class MyAspectJ {/*** @AfterReturning: 后置通知,在連接點方法執行之后執行后置通知方法* 方法定義格式:* 1、公共方法* 2、沒有返回值* 3、方法名稱自定義* 4、與前置通知一樣,可以有JoinPoint類型參數,該參數表示連接點方法對象;還可以有一個*    Object類型參數,用于接收連接點方法的執行結果,注意該參數的參數名必須與切入點表達式*    的returning屬性的屬性值一致,表示將returning屬性值賦給Object對象*//*@AfterReturning(value = "execution(* *..ServiceImpl.doOther(..))", returning = "obj")public void afterTransaction(JoinPoint jp, Object obj) {System.out.println("doOther方法的返回參數="+obj);System.out.println("事務已提交...");經過驗證:在后置通知切面內不能改變連接點方法的返回值}*/@AfterReturning(value = "execution(* *..ServiceImpl.doStudent(..))", returning = "obj")public void afterTransaction(JoinPoint jp, Object obj) {System.out.println(obj);Student student = new Student();student.setName("李四");student.setAge(24);obj = student;System.out.println("===查看是否改變了連接點方法的返回值==="+obj);/*經過驗證:在后置通知切面內不能改變連接點方法的返回值*/}
}

3.4、@Around環繞通知(功能最強的通知)

環繞通知是功能最強的通知,它的本質就是jdk動態代理,他可以在連接點方法之前和之后都可以執行,最厲害的是他可以改變連接點方法的執行結果(返回結果)。還是拿上面的doStudent(Student student)方法來說明,經過驗證前置通知和后置通知都不能改變doStudent(Student student)方法的返回值。下面看一下環繞通知是如何做的。

切面類

@Aspect
public class MyAspectJ {/*環繞通知:@Around(切入點表達式)1、環繞通知是最重要的一個通知,他表示在連接點方法的前或者后都可以執行,它的本質就是jdk動態代理的invoke方法的method參數2、定義格式a、publicb、必須有返回值,類型為Object*/@Around(value = "pointCut()")/*再次回憶一下jdk動態代理的invoke方法的定義@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {是不是感覺與下面的方法定義眼熟啊,沒錯,環繞通知切面的定義實質上就是jdk動態代理*/public Object around(ProceedingJoinPoint pj) throws Throwable {System.out.println("環繞通知在連接點方法之前執行了...");Object result = null;result = pj.proceed();Student student = new Student();student.setName("李四");student.setAge(24);//改變連接點方法返回值result = student;System.out.println("事務已提交...");return result;}/*使用pointcut管理切面表達式1、在一個切面類中,若多個切面的切面表達式均為同一個,每次都要寫重復的代碼,此時就可以使用pointcut來管理切面表達式了2、定義格式:公共public無返回值無參數*/@Pointcut(value = "execution(* *.doStudent(..))")public void pointCut() {//空方法體}
}

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

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

相關文章

2核4G云服務器租用價格_2核4G云主機優惠價格_2024年報價

租用2核4G服務器費用價格&#xff0c;2核4G云服務器多少錢一年&#xff1f;1個月費用多少&#xff1f;阿里云2核4G服務器30元3個月、輕量應用服務器2核4G4M帶寬165元一年、企業用戶2核4G5M帶寬199元一年&#xff1b;騰訊云輕量2核4G服務器5M帶寬165元一年、252元15個月、540元三…

Spring IOC在業務中常見的使用方式

目錄 1、什么是IOC 2、java實現創建對象的方式有哪些 3、基于配置文件的di實現 3.1、什么是di 3.2、入門案例 3.3、環境搭建 接口和實現類 ioc配置文件 測試程序 3.4、案例總結 3.5、簡單類型屬性的賦值&#xff08;set注入&#xff09; set注入要求 JavaBean sp…

前端項??件很?,?且??訪問速度慢,如何在前端側提?性能?

1. 網絡優化 減少HTTP請求的數量&#xff0c;可以通過合并CSS和JavaScript文件來實現。使用CDN&#xff08;內容分發網絡&#xff09;來加速靜態資源的加載速度。對圖片進行壓縮&#xff0c;選擇正確的格式&#xff0c;并實現懶加載技術&#xff0c;以減少頁面初次加載時的數據…

代碼隨想錄day12(2)字符串:重復的子字符串(leetcode459)

題目要求&#xff1a;給定一個非空的字符串&#xff0c;判斷它是否可以由它的一個子串重復多次構成。給定的字符串只含有小寫英文字母&#xff0c;并且長度不超過10000。 思路&#xff1a; 一、首先對于暴力解法&#xff0c;可以枚舉所有的字串進行判斷。但是枚舉時實際上只需…

rt thread stdio如何同時生成bin和hex

一、rt thread stdio默認生成bin文件&#xff1a; rt thread stdio 軟件編譯時&#xff0c;默認生成bin文件&#xff1b; 二、rt thread stdio如何同時生成bin和hex 右鍵單擊-->項目-->屬性-->C/C構建-->設置-->構建步驟-->(構建后步驟)命令&#xff1a; …

視頻如何無水印保存?這三種下載方法趕緊收藏

在互聯網時代&#xff0c;視頻已成為我們獲取信息、娛樂休閑的重要途徑。然而&#xff0c;有時我們想要保存或分享某些視頻時&#xff0c;卻發現下載起來卻帶有水印。為了解決這個問題&#xff0c;今天給大家帶來幾個無水印下載的方法。 方法一&#xff1a;水印云 水印云是一…

Python使用模塊和庫編程

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 路在腳下&#xff0c;勇往直前&#x…

Spring Boot2.2.4版本啟動項目時,訪問登錄接口顯示頁面不存在

問題觸發場景&#xff1a;IDEA 2023.3.4 SpringBoot 2.2.4 上面4張圖片分別是項目結構、Spring Boot啟動配置、SpringMVC配置和頁面展示在項目中存放的位置&#xff0c;表面上看上去沒有太大問題&#xff0c;項目應該會達到預期結果&#xff0c;但是bug總是在不經意間出現&…

MySQL數據庫運維第一篇(日志與主從復制)

文章目錄 一、錯誤日志二、二進制日志三、查詢日志四、慢查詢日志&#xff08;記錄超時的sql語句&#xff09;五、主從復制概括六、主從復制原理七、搭建主從復制八、主從復制的測試 在這篇深入的技術文章中&#xff0c;作者將以明晰透徹的方式詳細介紹MySQL數據庫中關鍵的日志…

XGB-16:自定義目標和評估指標

概述 XGBoost被設計為一個可擴展的庫。通過提供自定義的訓練目標函數和相應的性能監控指標&#xff0c;可以擴展它。本文介紹了如何為XGBoost實現自定義的逐元評估指標和目標。 注意&#xff1a; 排序不能自定義 在接下來的兩個部分中&#xff0c;將逐步介紹如何實現平方對數…

【EAI 027】Learning Interactive Real-World Simulators

Paper Card 論文標題&#xff1a;Learning Interactive Real-World Simulators 論文作者&#xff1a;Mengjiao Yang, Yilun Du, Kamyar Ghasemipour, Jonathan Tompson, Leslie Kaelbling, Dale Schuurmans, Pieter Abbeel 作者單位&#xff1a;UC Berkeley, Google DeepMind, …

【 Docker 容器詳細介紹和說明】

Docker 容器詳細介紹和說明 Docker 容器詳細介紹和說明Docker 安裝步驟&#xff08;以Ubuntu為例&#xff09;&#xff1a;使用Docker創建并運行容器&#xff1a;VSCode遠程連接Docker容器&#xff1a;步驟1&#xff1a;配置Docker環境步驟2&#xff1a;配置PyCharm步驟3&#…

日本發動全面侵華戰爭他們在怕什么?為何不敢動陜西,

日本全面侵華戰爭之謎&#xff1a;恐懼與野心的交織 在二十世紀三十年代&#xff0c;日本帝國主義以令人發指的暴行和殘忍手段&#xff0c;對中國發動了全面侵華戰爭。然而&#xff0c;在這場戰爭中&#xff0c;有一個引人關注的現象&#xff1a;日本侵略者在進攻過程中&#…

python和nodejs一鍵安裝當前項目所有依賴

python和nodejs一鍵安裝當前項目所有依賴。群里有人問怎么快速安裝網上下載的源碼里面的依賴。所以在這里分享一下。更多問題可以自己加群917400262問我。 目錄導航 1.0 python一鍵安裝當前項目所有依賴2.0 nodejs一鍵安裝當前項目所有依賴 1.0 python一鍵安裝當前項目所有依賴…

snakemake: 基礎知識

為了有效地學習和使用 Snakemake&#xff0c;你需要具備一定的基礎知識。這些基礎知識將幫助你更好地理解 Snakemake 的工作原理和如何在你的項目中應用它。以下是學習 Snakemake 所需的一些基礎知識&#xff1a; 1. Python 編程 Snakemake 是用 Python 編寫的&#xff0c;并…

聊聊國內「類Sora模型」發展現狀,和 Sora 的差距到底有多大?

2024 年 2 月 16 日。 就在谷歌發布他新一代的多模態大模型 Gemini 1.5 Pro 的同一天&#xff0c;OpenAI 帶著新一代的文生視頻模型 Sora 再次抓住了全世界人們的眼球。 “顛覆”、“炸裂”、“變天”、“瘋狂”&#xff0c;類似的形容詞一夜之間簇擁在 Sora 周圍&#xff0c;…

網絡傳輸基本流程(封裝,解包)+圖解(同層直接通信的證明),報頭分離問題,協議定位問題,協議多路復用

目錄 網絡傳輸基本流程 引入 封裝 過程梳理 圖解 報文 解包 過程梳理 圖解 -- 同層直接通信的證明 總結 解包時的報頭分離問題 舉例 -- 倒水 介紹 自底向上傳輸時的協議定位問題 介紹 解決方法 協議多路復用 介紹 優勢 網絡傳輸基本流程 引入 首先,我們明確…

VS查看C++頭文件(.h文件)的函數列表

這里使用的是VS2019舉例 如下圖查看Actor.h文件中的函數列表 設置步驟如下圖

【d35】【Java】【力扣】28. 找出字符串中第一個匹配項的下標

題目 給你兩個字符串 haystack 和 needle &#xff0c;請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標&#xff08;下標從 0 開始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;則返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;haystac…

【大數據】通過 docker-compose 快速部署 MinIO 保姆級教程

文章目錄 一、概述二、MinIO 與 Ceph 對比1&#xff09;架構設計對比2&#xff09;數據一致性對比3&#xff09;部署和管理對比4&#xff09;生態系統和兼容性對比 三、前期準備1&#xff09;部署 docker2&#xff09;部署 docker-compose 四、創建網絡五、MinIO 編排部署1&…