SpringBootWeb 篇-深入了解 Spring 異常處理、事務管理和配置文件參數配置化、yml 配置文件

🔥博客主頁:?【小扳_-CSDN博客】
?感謝大家點贊👍收藏?評論?

文章目錄

????????1.0 配置文件

? ? ? ? 1.1 yml 配置文件

? ? ? ? 1.2?參數配置化

????????1.2.1 使用 @Value 注解注入單個配置參數

? ? ? ? 1.2.2 使用 @ConfigurationProperties 注解將一組相關配置參數注入到一個類中

????????2.0 異常處理

? ? ? ? 3.0 Spring 事務管理

? ? ? ? 3.1 @Transactional 注解

? ? ? ? 3.2?rollbackFor 屬性與?propagation 屬性


????????1.0 配置文件

????????在 SpringBootWeb 項目中,配置文件通常是 application.propertiesapplication.yaml 或者 application.yml ,存放在 src/main/resources 目錄下。這些配置文件用于配置應用程序的屬性和設置,可以包括數據庫連接信息、日志級別、服務器端口等項目配置。

? ? ? ? 1.1 yml 配置文件

????????是一種簡潔易讀的數據序列化格式,常用于配置文件和數據交換。YAML 配置文件通常以 .yml 或 .yaml 為擴展名,其內容由鍵值對、列表、嵌套結構等組成,支持注釋、縮進和多種數據類型。需要注意的是,":" 后面不是直接加上 value 值,而是有一個空格隔離開來的。

? ? ? ? 1)鍵值對:使用冒號(:)分隔鍵和值,例如:

key1: value1
key2: value2

? ? ? ? ?2)列表:使用短橫線(-)表示一個項,例如:

- item1
- item2

? ? ? ? ?3)嵌套結構:可以將鍵值對或列表嵌套在另一個鍵或值中,例如:

key1:
? subkey1: value1
? subkey2: value2

application.properties 文件中,可以通過鍵值對的方式來配置屬性,例如:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456

application.yaml 文件中,則采用了更加清晰的層次結構來配置屬性,例如:

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: 123456

可以根據項目需求選擇使用 application.properties 或 application.yaml 來配置項目屬性,這些配置文件會被 SpringBoot 自動加載并應用到項目中。

? ? ? ? 1.2?參數配置化

????????參數配置化是指將應用程序中的配置參數與代碼邏輯分離,以便在不修改代碼的情況下更改參數值。在 SpringBoot 項目中,我們可以將參數配置化為配置文件中,然后在代碼中通過注解或者通過 @Value 注入方式來使用這些配置參數。

????????1.2.1 使用 @Value 注解注入單個配置參數

? ? ? ? 簡單來說,根據鍵來給變量注入值,@Value 注解中的 ${} 的形式來指定鍵。

#mysql 配置
spring:datasource:drive-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db05?characterEncoding=utf-8&useSSL=trueusername: rootpassword: 123456
    @Value("${spring.datasource.url}")String databaseUrl;@Testpublic void test3(){System.out.println(databaseUrl);}

運行結果:

? ? ? ? 1.2.2 使用 @ConfigurationProperties 注解將一組相關配置參數注入到一個類中

? ? ? ? 首先先創建一個類,成員變量的名稱與配置文件中的參數名稱保持一致,且將該類對象進行控制反轉,將其成為 Bean 對象。

????????最后,在該類上加上 @ConfigurationProperties 注解,注解中的屬性 prefix 指定屬性的前綴。

代碼演示:

Pojo 類:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class Pojo {private String url;private String username;private String password;
}

配置文件:

#mysql 配置
spring:datasource:drive-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db05?characterEncoding=utf-8&useSSL=trueusername: rootpassword: 123456

測試代碼:

    @AutowiredPojo pojo;@Testpublic void test4(){System.out.println(pojo.getUrl());System.out.println(pojo.getUsername());System.out.println(pojo.getPassword());}

運行結果:

????????這樣就可以將一組相關配置參數綁定到一個類中。這樣,SpringBoot 會自動將前綴的屬性值綁定到類中對應的字段上。這種方式可以使得代碼更加清晰和整潔,將一組相關的配置參數集中管理在一個類中。

????????2.0 異常處理

? ? ? ? 在 SpringBootWeb 項目中,避免不了會有異常拋出,那么如果異常拋出來,沒有進行有效的捕獲,那么異常就會直接響應給客戶端。

? ? ? ? 為了避免將異常直接返回給客戶端,需要將異常進行全部捕獲處理之后,再響應給客戶端。

? ? ? ? 1)首先創建一個捕獲異常的類,在類中定義一個方法且在該方法上加上 @ExceptionHandler 注解,在注解上設置 Exception.class?的屬性,從而捕獲全局的異常。最后在該類上加上 @RestControllerAdvice 注解,將對象返回值的格式轉換成 json 格式。

代碼演示:

import org.example.Pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class exceptionHandler {//捕獲異常@ExceptionHandler(Exception.class)public Result catchException(Exception ex){ex.printStackTrace();return Result.error("error");}
}


? ? ? ? 3.0 Spring 事務管理

????????通過使用 Spring 的事務管理可以簡化開發過程,同時確保數據操作的一致性和完整性。簡單來說,要么都不執行,要么都執行。當在同一件事務中代碼執行到一半,遇到異常了,那么后面的代碼直接結束,都不會執行了,前面已經執行的代碼就會進行回滾,回到原來的狀態。

? ? ? ? 3.1 @Transactional 注解

????????是 Spring Framework 提供的用于聲明式事務管理的注解之一。通過在方法上添加 @Transactional 注解,可以告訴 Spring 將該方法的執行過程納入事務管理范圍。

? ? ? ? 1)首先,在 Spring 的配置文件中配置事務管理器和事務通知器。

? ? ? ? 2)然后在需要添加事務的方法上加上 @Transactional 注解,Spring 會根據這個注解來管理該方法的事務。

? ? ? ? 3)@Transactional 注解提供了很多屬性來定義事務的傳播行為、隔離級別、超時時間等。

代碼演示:

    @Override@Transactionalpublic void deleteId(Integer id) {deptMapper.deleteId(id);empMapper.deleteByDeptId(id);}

? ? ? ? ?以上的兩個操作就會綁定在一起,要么一起執行,要么都不執行。

? ? ? ? 3.2?rollbackFor 屬性與?propagation 屬性

? ? ? ? 1)rollbackFor 屬性用于指定哪些異常需要回滾事務。如果方法中拋出的異常是指定的異常類型之一,事務將回滾;否則,事務不會回滾。接受一個數組,可以指定多個異常類型。常見的用法是將一些受檢查異常(checked exception)轉換為不受檢查異常(unchecked exception),從而觸發事務回滾。

????????默認情況下,@Transactional 注解中的?rollbackFor 屬性未指定時,事務將回滾的默認異常是 RuntimeException 及其子類。也就是說,如果方法中拋出的異常是?RuntimeException 或其子類之一,事務將會回滾。

代碼演示:

    @Transactional(rollbackFor = Exception.class)public void deleteId(Integer id) {deptMapper.deleteId(id);empMapper.deleteByDeptId(id);}

? ? ? ? 一旦拋出異常,都會進行回滾操作。Exception.class 代表遇到任何一種異常都會進行回滾操作。

? ? ? ? 2)propagation 屬性

????????propagation 屬性是?@Transactional ?注解中用來指定事務的傳播行為的一個屬性。通過設置?propagation 屬性,可以控制方法之間的事務如何傳播和交互。

propagation 屬性可能的取值:

? ? ? ? Propagation.REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是最常用的傳播行為。

@Transactional(propagation = Propagation.REQUIRED)
public void updateUser(User user) {// 如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務
}

????????Propagation.REQUIRES_NEW:創建一個新的事務,并暫停當前事務(如果存在)。新事務和當前事務之間是獨立的,互不影響。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserWithNewTransaction(User user) {// 創建一個新的事務,暫停當前事務(如果存在)
}

????????通過合理設置?propagation 屬性,可以實現對事務傳播行為的控制,確保事務的正確性和一致性。?

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

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

相關文章

discuz論壇怎么修改備案信息

大家好,今天給大家分享下discuz如何填寫備案信息并且展示在網站首頁。大家都知道國內網站都需要備案,不通過備案的網站上是沒辦法通過域名打開的。大家也可以通過搜索網創有方,或者直接點擊網創有方 查看懸掛備案號后的效果。 首先大家可以看…

如何在CentOS中合理劃分磁盤空間以優化系統性能

目錄 前言 理想的分區方案 為什么需要單獨分區 安全性 性能 管理和維護 穩定性和可靠性 升級和兼容性 結論 前言 在進行CentOS系統的安裝和配置時,合理劃分磁盤空間是確保系統性能、安全性和易于管理的關鍵步驟。本文將探討如何根據系統的硬件配置和預期用途…

安全測試掃描利器-Burpsuite

🔥 交流討論:歡迎加入我們一起學習! 🔥 資源分享:耗時200小時精選的「軟件測試」資料包 🔥 教程推薦:火遍全網的《軟件測試》教程 📢歡迎點贊 👍 收藏 ?留言 &#x1…

vscode常用插件及插件安裝方式

一、常用插件 Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code 說明:中文語言包擴展(簡體) open in browser 說明:可以在默認瀏覽器或應用程序中打開當前文件 Auto Rename Tag 說明:自動重…

Linux 命令:awk

1. 寫在前面 本文主要介紹 Linux “awk” 命令:“awk” 是另一個強大的文本處理工具,用于處理和操作結構化數據,如日志文件和命令輸出。它可以根據需要為我們打印特定的列值。 公眾號: 滑翔的紙飛機 2. awk 命令 我們能用 awk 做…

Android 控件保持寬高比得幾種方式

文章目錄 Android 控件保持寬高比得幾種方式adjustViewBounds百分比布局ConstraintLayout自定義View Android 控件保持寬高比得幾種方式 adjustViewBounds 僅適用于 ImageView&#xff0c;保持橫豎比。 <ImageViewandroid:layout_width"match_parent"android:l…

動態規劃(Dynamic-Programming)問題講解

動態規劃類問題 從已知子問題的解&#xff0c;推導出當前問題的解 推導過程可以表達為一個數學公式用一維或二維數組來保存之前的計算結果&#xff08;可以進一步降維優化&#xff09; 將當前問題 分解成子問題 &#xff0c;找出遞歸公式&#xff0c;分階段進行求解 求解過程中…

vue3+ts封裝一個button組件

創建一個新的Button組件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 創建生成器的方式 生成器推導式yield關鍵字 生成器相關方法 for&#xff1a;循環遍歷生成器中的每一個值next&#xff1a;獲取生成器中的下一個值 生成器注意點 代碼執行到yield會暫停&#xff0c;然后把結果返回出去&#xff0c;下次啟動生成器會在暫停的位置繼續執行…

進程間通信(27000字超詳解)

&#x1f30e;進程間通信 文章目錄&#xff1a; 進程間通信 進程間通信簡介 ??????進程間通信目的 ??????初識進程間通信 ??????進程間通信的分類 匿名管道通信 ??????認識管道 ??????匿名管道 ??????匿名管道測試 ??????管道的四種…

第十五課,海龜畫圖:抬筆與落筆函數、畫曲線函數

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起與落下畫筆函數 當使用上節課學習的這個turtle.forward()&#xff1a;畫筆前進函數時&#xff0c;畫筆會朝著當前方向在畫布上留下一條指定&#xff08;像素&#xff09;長度的直線&#xff0c;但你可能發現&a…

Map Python用法:深度解析與應用探索

Map Python用法&#xff1a;深度解析與應用探索 在Python編程中&#xff0c;map() 函數是一種強大的內置高階函數&#xff0c;用于對可迭代對象中的每個元素應用指定的函數&#xff0c;并返回一個新的迭代器&#xff0c;其中包含函數應用后的結果。本文將從四個方面、五個方面…

Bean的生命周期中有哪些對外開放的接口,及各種作用

Bean的生命周期中有哪些對外開放的接口&#xff0c;及各種作用 在 Spring 框架中&#xff0c;Bean 的生命周期可以通過一系列的回調接口來管理和控制。以下是 Spring 中對外開放的主要 Bean 生命周期接口以及它們的作用&#xff1a; InitializingBean 和 DisposableBean 接口&…

C++|set、map模擬實現<——紅黑樹

目錄 一、紅黑樹的迭代器 1.1紅黑樹迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用紅黑樹搭配map和set(仿函數) 三、紅黑樹封裝map和set(簡易版…

springboot + Vue前后端項目(第十三記)

項目實戰第十三記 寫在前面1.建立角色表2. 后端代碼生成2.1 RoleController 3. 前端頁面的搭建3.1 Role.vue3.2 路由3.3 Aside.vue3.4 頁面效果 4.建立菜單表5.后端代碼編寫5.1 Menu5.2 MenuController 6.前端頁面的搭建6.1 Menu.vue6.2 路由6.3 Aside.vue6.4 頁面效果 總結寫在…

keepalived安裝文檔

目錄 1、安裝環境 2、安裝keepalived 2.1 上傳keepalived安裝文件 2.2 解壓 2.3 安裝keepalived 2.4 加入開機啟動&#xff1a; 2.5 配置日志文件 2.6 打開防火墻的通訊地址 1、安裝環境 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y …

vx小程序初學

小程序初學 在我還沒接觸到微信小程序之前&#xff0c;通常使用輪播要么手寫或使用swiper插件去實現&#xff0c;當我接觸到微信小程序之后&#xff0c;我看到了微信小程序的強大之處&#xff0c;讓我為大家介紹一下吧&#xff01; swiper與swiper-item一起使用可以做輪播圖 …

把自己的服務器添加到presearch節點

Presearch is a scam. Before, judging by the price of the token you should have been able to get between $150-$200 after 12-13 months of regular searches. "If you use this service for the next 11 years you will have earned $30!" Presearch大約需要…

Easy RoCE:在SONiC交換機上一鍵啟用無損以太網

RDMA&#xff08;遠程直接內存訪問&#xff09;技術是一種繞過 CPU 或操作系統&#xff0c;在計算機之間直接傳輸內存數據的技術。它釋放了內存帶寬和 CPU&#xff0c;使節點之間的通信具有更低的延遲和更高的吞吐量。目前&#xff0c;RDMA 技術已廣泛應用于高性能計算、人工智…

車流量監控系統

1.項目介紹 本文檔是對于“車流量檢測平臺”的應用技術進行匯總&#xff0c;適用于此系統所有開發&#xff0c;測試以及使用人員&#xff0c;其中包括設計背景&#xff0c;應用場景&#xff0c;系統架構&#xff0c;技術分析&#xff0c;系統調度&#xff0c;環境依賴&#xf…