后端框架(3):Spring(2)

AOP

概述:AspectOrientedProgramming 面向切面編程:是對面向對象編程的補充延續,面向切面編程思想是將程序中非業務代碼(提交事務,打印日志,權限驗證,統一異常處理)

然后在調用業務代碼時,通過一個代理對象幫助我們調用這些提取出來的非業務代碼,這樣在業務代碼不用顯示的調用非業務代碼,做到的業務代碼和非業務代碼的分離,降低了耦合度。

????????好處:模塊之間的耦合度降低了

????????原理:動態代理模式 給業務代碼生成代理對象

AOP的基本概念

? ? 連接點(Joinpoint):類中可以被增強(加功能)的方法,這個方法就被稱為連接點

? ? 切入點(pointcut):類中有很多方法可以被增強,但實際中只有add和update 被增了,那么add和update方法就被稱為切入點(實際實現的連接點)

? ? 通知(Advice): 通知是指一個切面在特定的連接點要做的事情(增強的功能)。通知分為方法執行前通知,方法執行后通知,環繞通知等.

? ? 目標(Target): 代理的目標對象(連接點,切入點所在類)

? ? 代理(Proxy): 向目標對象應用通知時創建的代理對象

springAOP 實現

? ? ? ? 在pom.xml文件中導入AOP相關的jar包(AspectJ)

<!--spring aop--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.2.2.RELEASE</version></dependency> 

? ?? ? ?在spring.xml文件中配置開啟AspectJ的自動代理

<!--開啟自動代理--><aop:aspectj-autoproxy />

AspectJ中常用的通知有五種類型:

????????通知,向連接點添加的功能

注解實例:

? 1.@before()

????????@Before() 前置通知 在業務方法執行之前調用執行

/*execution:表達式的主體第一處*:返回的類型(這里代表所有類型)com.ffyc.springpro.dao:攔截的包名第二處*:類名第三處*:方法名(..):表示方法的參數,".."表示任意參數
*/@Before("execution(* com.ffyc.springpro.dao.*.*(..))")
public void printlog(){System.out.println("打印日志");}

????????????????????????

2.@After()

????????@After() 后置通知 在業務方法執行完后調用執行 即使業務代碼中出現了異常,也會執行

@After("execution(* com.ffyc.springpro.dao.*.*(..))")
public void printlog(){System.out.println("打印日志");}

????????????????? ? ? ?

3.@AfterReturning()

?????????@AfterReturning() 返回通知 在業務方法執行完后再執行 當業務代碼中出現了異常,不會執行

 public void insert(){System.out.println("新增");System.out.println(10/0);}
@AfterReturning("execution(* com.ffyc.springpro.dao.*.*(..))")public void printlog(){System.out.println("打印日志");}

4.@AfterThrowing()

?????????@AfterThrowing() 異常通知 當業務代碼出現異常時,調用執行

 public void insert(){System.out.println("新增");System.out.println(10/0);}
@AfterThrowing(value = "execution(* com.ffyc.springpro.dao.*.*(..))",throwing = "e")public void exception(Throwable e){System.out.println("系統忙"+e.getMessage());e.printStackTrace();}

前四個注解為一組,一并使用。

5.@Around()

????????@Around 環繞通知 可以在業務方法執行之前,之后,出異常時添加功能

@Around(value = "execution(* com.ffyc.springpro.dao.*.*(..))")public void around(ProceedingJoinPoint joinPoint){//ProceedingJoinPoint joinPoint 表示的是目標方法System.out.println("前置通知");try {Object[] obj = joinPoint.getArgs();//獲取目標方法的參數System.out.println(Arrays.toString(obj));Object object = joinPoint.proceed();//調用目標業務方法System.out.println("返回通知");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("異常通知");}System.out.println("后置通知");}

????????

第五種@around注解相當于將前四個注解做的一個集合。

Spring 事物管理

? ? 事務管理本質上是數據庫提供的一種管理機制。

????????數據庫事務管理是對一次數據庫操作過程中執行的多條語句進行管理。

????????確保一次操作過程中的多條sql語句要么都執行成功,要么都不執行,從而保證數據一致性。

????????????????例如:轉賬: sql1 A-500 sql2 B+500 確保轉賬數據的一致

? ? spring事務管理是spring框架對事務提交這一功能進行封裝,程序員在業務開發中不需要顯示的提交事務。

Spring中的事務管理分為兩種方式:

1、編程式事務管理

????????需要程序員在代碼中自己控制事務提交和回滾

2、聲明式事務管理

????????聲明事務底層使用了AOP思想,可以為方法添加事務功能,它的控制是方法級別的

????????基于注解實現的spring事務管理 Spring 框架,提供事物管理實現類是DataSourceTransactionManager.

????????在spring.xml文件中配置以下兩個步驟

? ? ? ?1.配置事物管理器
<!-- 配置spring 事務管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="druidDataSource"></property></bean>
? ? ? ? 2.開啟注解事務管理
<!-- 開啟注解事務管理--><tx:annotation-driven transaction-manager="transactionManager"/>

? ? ? ??在類或方法上使用@Transactional標簽即可.

????????@Transactional 可以添加在方法上,也可以添加到類上面

???????????????????????????????? 如果添加在類上面,此類中的所有方法都在spring事務管理中運行

????????聲明式事務失效的情況

???????? 1.@Transactional 用在非public修飾的方法上

???????? 2.方法中的異常被捕獲了,認為方法沒有異常

???????? 3.方法中出現編譯期異常,還是會提交事務 解決方案:@Transactional(rollbackFor = Exception.class)

???????? 4.數據庫引擎不支持事務 mysql中只有innodb引擎支持事務的

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

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

相關文章

Vue3中setup運行時機介紹

在 Vue3 中&#xff0c;直接寫在 <script setup>...</script> 中的代碼運行時機可以分為以下幾個關鍵階段&#xff1a; 一、執行順序層級 #mermaid-svg-bF3p98MiNdLfcoSG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#33…

Ubuntu快速安裝Python3.11及多版本管理

之前文章和大家分享過&#xff0c;將會出一篇專欄&#xff08;從電腦裝ubuntu系統&#xff0c;到安裝ubuntu的常用基礎軟件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…

裸金屬服務器和云服務器之間的差別

裸金屬服務器能夠直接在硬件上運行&#xff0c;不需要額外的虛化層&#xff0c;讓每個應用程序或者是服務都能夠在實際的硬件上運行&#xff0c;不需要和其他虛擬服務器來共享資源&#xff1b;而云服務器作為一種虛擬服務器&#xff0c;是通過虛擬化技術為企業提供一個獨立的計…

C++ 中的幾種鎖機制整理

1. 互斥鎖&#xff08;std::mutex&#xff09; ? 簡介 最常用的線程同步工具。保證同一時間只能有一個線程訪問臨界區。 ? 使用方式 #include <mutex>std::mutex mtx;void safeFunction() {std::lock_guard<std::mutex> lock(mtx);// 臨界區代碼 }? 優點 簡…

Graph Representation Learning【圖最短路徑優化/Node2vec/Deepwalk】

文章目錄 Q1&#xff1a;網絡性質&#xff1a;1.數據讀取與鄰接表構建&#xff1a;2.基本特征和連通性&#xff1a; 算法思路&#xff1a;1. 廣度優先搜索&#xff08;BFS&#xff09;標記前驅:2. 回溯生成所有最短路徑: 實驗結果&#xff1a;復雜度分析&#xff1a; Q2&#x…

MATLAB中的概率分布生成:從理論到實踐

MATLAB中的概率分布生成&#xff1a;從理論到實踐 引言 MATLAB作為一款強大的科學計算軟件&#xff0c;在統計分析、數據模擬和概率建模方面提供了豐富的功能。本文將介紹如何使用MATLAB生成各種常見的概率分布&#xff0c;包括均勻分布、正態分布、泊松分布等&#xff0c;并…

經典算法 (A/B) mod C

(A/B) mod C 問題描述 求(A/B)%C&#xff0c;但由于A和B實在太大了&#xff0c;我們只給出A % C&#xff0c;B % C。 (我們保證給定的A必能被B整除&#xff0c;且gcd(B,C) 1)。 輸入描述 輸入一行三個整數&#xff0c;分別是A % C&#xff0c;B % C&#xff0c;C。 輸出…

大數據技術的主要方向及其應用詳解

文章目錄 一、大數據技術概述二、大數據存儲與管理方向1. 分布式文件系統2. NoSQL數據庫3. 數據倉庫技術 三、大數據處理與分析方向1. 批處理技術2. 流處理技術3. 交互式分析4. 圖計算技術 四、大數據機器學習方向1. 分布式機器學習2. 深度學習平臺3. 自動機器學習(AutoML) 五、…

Deeper and Wider Siamese Networks for Real-Time Visual Tracking

現象&#xff1a; the backbone networks used in Siamese trackers are relatively shallow, such as AlexNet , which does not fully take advantage of the capability of modern deep neural networks. direct replacement of backbones with existing powerful archite…

ubuntu22.04卸載vscode

方法 1&#xff1a;通過 Snap 卸載 VSCode 如果你是通過 Snap 安裝的 VSCode&#xff08;Ubuntu 22.04 默認推薦方式&#xff09;&#xff0c;按照以下步驟卸載&#xff1a; 檢查是否通過 Snap 安裝&#xff1a; bash snap list | grep code如果輸出顯示 code&#xff0c;說明…

OpenCV 背景建模詳解:從原理到實戰

在計算機視覺領域&#xff0c;背景建模是一項基礎且重要的技術&#xff0c;它能夠從視頻流中分離出前景目標&#xff0c;廣泛應用于運動目標檢測、視頻監控、人機交互等場景。OpenCV 作為計算機視覺領域最受歡迎的開源庫之一&#xff0c;提供了多種高效的背景建模算法。本文將深…

Android native崩潰問題分析

最近在做NDK項目的時候&#xff0c;出現了啟動應用就崩潰了&#xff0c;崩潰日志如下&#xff1a; 10:41:04.743 A Build fingerprint: samsung/g0qzcx/g0q:13/TP1A.220624.014/S9060ZCU4CWH1:user/release-keys 10:41:04.743 A Revision: 12 10:41:04.743 A ABI: arm64…

【Shell的基本操作】

文章目錄 一、實驗目的二、實驗環境三、實驗內容3.1 Shell變量與腳本基礎3.2 定制終端提示符&#xff08;PS1變量&#xff09;3.3 文件查找與類型確認&#xff08;find命令&#xff09;3.4 管道命令實戰&#xff08;用戶登錄統計&#xff09;3.5 交互式備份壓縮腳本 四、總結4.…

快速選擇算法:優化大數據中的 Top-K 問題

在處理海量數據時&#xff0c;經常會遇到這樣的需求&#xff1a;找出數據中最大的前 K 個數&#xff0c;而不必對整個數據集進行排序。這種場景下&#xff0c;快速選擇算法&#xff08;Quickselect&#xff09;就成了一個非常高效的解決方案。本文將通過一個 C 實現的快速選擇算…

AQS 基本思想與源碼分析

充分了解 AbstractQueuedSynchronizer 對于深入理解并發編程是有益處的&#xff0c;它是用來構建鎖或者其他同步組件的基礎框架&#xff0c;我們常用的同步工具類如 CountDownLatch、Semaphore、ThreadPoolExecutor、ReentrantLock 和 ReentrantReadWriteLock 內部都用到了它。…

理解位圖算法:使用 C++ 實現高效數據查重

在處理海量數據時&#xff0c;我們常常需要檢查某個元素是否已經存在于集合中。傳統的方法如哈希表或集合容器雖然有效&#xff0c;但在數據量極大的情況下會占用大量內存。這時&#xff0c;位圖算法 (Bitmap) 就成為了一種非常高效的解決方案。本文將通過分析一段使用位圖算法…

數學復習筆記 12

前言 現在做一下例題和練習題。矩陣的秩和線性相關。另外還要復盤前面高數的部分的內容。奧&#xff0c;之前矩陣的例題和練習題&#xff0c;也沒有做完&#xff0c;行列式的例題和練習題也沒有做完。累加起來了。以后還是得學一個知識點就做一個部分的內容&#xff0c;日拱一…

1-10 目錄樹

在ZIP歸檔文件中&#xff0c;保留著所有壓縮文件和目錄的相對路徑和名稱。當使用WinZIP等GUI軟件打開ZIP歸檔文件時&#xff0c;可以從這些信息中重建目錄的樹狀結構。請編寫程序實現目錄的樹狀結構的重建工作。 輸入格式: 輸入首先給出正整數N&#xff08;≤104&#xff09;…

Python爬蟲實戰:研究 RPC 遠程調用機制,實現逆向解密

1. 引言 在網絡爬蟲技術的實際應用中,目標網站通常采用各種加密手段保護其數據傳輸和業務邏輯。這些加密機制給爬蟲開發帶來了巨大挑戰,傳統的爬蟲技術往往難以應對復雜的加密算法。逆向解密作為一種應對策略,旨在通過分析和破解目標網站的加密機制,獲取原始數據。 然而,…

debugfs:Linux 內核調試的利器

目錄 一、什么是 debugfs&#xff1f;二、debugfs 的配置和啟用方式2.1 內核配置選項2.2 掛載 debugfs2.3 Android 系統中的 debugfs 三、debugfs 的典型應用場景3.1 調試驅動開發3.2 內核子系統調試3.3 性能分析 四、常見 debugfs 子目錄與功能示例4.1 /sys/kernel/debug/trac…