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: 8080
  
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 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.Driver
    url: jdbc:mysql://localhost:3306/db05?characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456
    @Value("${spring.datasource.url}")
    String databaseUrl;

    @Test
    public 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.Driver
    url: jdbc:mysql://localhost:3306/db05?characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456

测试代码:

    @Autowired
    Pojo pojo;
    @Test
    public 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
    @Transactional
    public 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 属性,可以实现对事务传播行为的控制,确保事务的正确性和一致性。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/668440.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大型企业用什么文件加密软件,五款适合企业的文件加密软件

大型企业在选择文件加密软件时,通常会倾向于那些能够提供全面数据保护、具有高度可定制性、易于管理且能适应复杂组织结构的解决方案。以下是一些适合大型企业使用的文件加密软件: 1.域智盾软件: 作为一款企业级文件加密软件,支持…

Linux系统Mysql 8.0版本的安装

一、MySQL介绍 1.1 MySQL简介 1.2 MySQL特点 二、卸载mariadb数据库 2.1 卸载mariadb数据库 2.2 卸载mysql数据库 三、配置yum仓库 3.1 下载rpm文件 3.2 配置yum仓库 3.3 启动mysql服务 3.4 检查mysql服务状态 四、mysql的初始配置 4.1 获取登录密码 4.2 本地登录…

二叉树链式结构的前序、中序、后序、层序遍历

文章目录 一、二叉树创建二、前序遍历概念以及解释代码 三、中序遍历概念及解释代码 四、后序遍历概念及解释代码 五、层序遍历概念及解释代码 一、二叉树创建 &mesp; 实现二叉树的遍历,我们要先手搓出一个二叉树,在次基础上实现二叉树的前序、中序…

清洁力强的洗地机前十名排行榜:2024十大洗地机热销款式好用不踩雷

如今,洗地机行业竞争激烈,各品牌紧紧抓住用户对智能化和深度清洁的需求,深入研究创新。经过几轮行业内部的激烈竞争后,许多厂商在宣传中各说各的,对洗地机的重要参数描述不一,给消费者的选择带来了不少困惑…

深度学习-02-创建变量的函数

深度学习-02-创建变量的函数 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xff0…

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡,面对语言不通的窘境,即便是简单的对话也变得异常困难,真是挑战满满! 然而,能离线翻译的软件让语言障碍不再是问题,不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包,选择…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接: https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图,队列 构件图,直接从target出发,扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus,成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌,Claude3发布方Anthropic公司的联合创始人兼CEO,达里奥阿莫迪(DarioAmodei)承诺:在能够制…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器,以下是对其的详细介绍: 1. 定义与别称: 激光焊接机,又常称为激光焊机、镭射焊机,是材料加工激光焊接时用的机器。 2. 工作原理: 激光焊接是利用高能量…

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似,只不过这这里不需要劣等马去抵消掉优等马,直接上贪心策略: 先将两个数组排序。针对胃口较小的孩子,从小到大挑选饼干: i. 如果当前饼干能满足,直接喂(最小…

【CPP】栈简介及简化模拟实现

CPP栈和队列简单模拟实现 目录 1. 栈的简介2. 栈简化模拟实现3. 栈练习题 1. 栈的简介 栈 是一种 特殊的线性表,具有数据 先进后出 特点。 具体参考:【数据结构】栈 CPP库参考文档:stl_stack 注意: 1.stack本身 不支持迭代器操…

C++之构造函数总结

1、构造函数定义 在C中,构造函数是一种特殊的成员函数,它在创建一个类的对象时自动被调用。构造函数的主要目的是初始化类对象的成员变量,为对象分配资源,以及执行任何其他必要的初始化任务。 构造函数具有以下特点: …

WinApp自动化测试之辅助工具介绍

前篇文章中,我们简单介绍了部分WinApp自动化测试脚本常规操作,今天我们来讲剩余的部分。 文件批量上传 文件批量上传和文件单个上传原理是相同的,单个上传直接传入文件路径即可,批量上传需要进入批量上传的文件所在目录&#xf…

python-双胞胎字符串

[问题描述]:给定两个字符串s和t,每次可以任意交换s的奇数位和偶数位的字符,即奇数位的字符可以与任意其它奇数位的字符交换,偶数位的字符同样也可以与任意偶数位的字符的字符交换,问能否在有限的次数的交换下使s变为t?…

0基础学习Elasticsearch-Quick start

文章目录 1 背景2 前言3 快速部署ES4 快速部署Kibana5 发送请求给ES5.1 打开Kibana控制台5.2 通过REST API发送请求5.3 通过curl发送请求5.4 添加数据5.4.1 添加单个document5.4.2 添加多个document 5.5 搜索数据5.5.1 搜索所有documents5.5.2 match查询 6 总结 1 背景 因电商项…

【算法】模拟算法——外观数组(medium)

题解:模拟算法——外观数组(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 首先应该理解题意: 就是开始给你一个字符串,然后你对其进行描述。 描述规则是:连续的数字为一组,…

大学生社团活动平台系统基于springboot+vue的社团管理系统java项目sprignboot项目

文章目录 大学生社团活动平台一、项目介绍二、部分功能截图三、部分代码展示四、底部获取项目源码(9.9¥带走) 大学生社团活动平台 一、项目介绍 基于springbootvue的前后端分离大学生社团活动平台 系统角色 : 学生、社长、管理员 1、学生…

自学 Java 怎么入门?

关于自学 Java 如何入门这一重要课题,在此为大家进行详细阐述。 在此之前,如果大家有兴趣的话,可以看看我自己精心整理的嵌入式入门资料,这些资料将全部免费送给大家。其中包含了编程教学内容、详细的视频讲解、实用的数据库资料…

Java项目:92 基于SSM的办公管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 基于SSM的办公管理系统 1、项目介绍 基于SSM的办公管理系统主要是对于办公用品的申领进行管理,系统分为三种角色,超级管理员、企业 职…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块?1.2 为什么不使用Encoder模块? 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中,深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…