🔥博客主頁:?【小扳_-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.properties 或 application.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 屬性,可以實現對事務傳播行為的控制,確保事務的正確性和一致性。?