SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件

本文主要是介绍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 属性,可以实现对事务传播行为的控制,确保事务的正确性和一致性。 

这篇关于SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021904

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res