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.mzph.cn/bicheng/20460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

discuz论坛怎么修改备案信息

大家好,今天给大家分享下discuz如何填写备案信息并且展示在网站首页。大家都知道国内网站都需要备案,不通过备案的网站上是没办法通过域名打开的。大家也可以通过搜索网创有方,或者直接点击网创有方 查看悬挂备案号后的效果。 首先大家可以看…

安全测试扫描利器-Burpsuite

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

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

一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 说明:中文语言包扩展(简体) open in browser 说明:可以在默认浏览器或应用程序中打开当前文件 Auto Rename Tag 说明:自动重…

Android 控件保持宽高比得几种方式

文章目录 Android 控件保持宽高比得几种方式adjustViewBounds百分比布局ConstraintLayout自定义View Android 控件保持宽高比得几种方式 adjustViewBounds 仅适用于 ImageView&#xff0c;保持横竖比。 <ImageViewandroid:layout_width"match_parent"android:l…

动态规划(Dynamic-Programming)问题讲解

动态规划类问题 从已知子问题的解&#xff0c;推导出当前问题的解 推导过程可以表达为一个数学公式用一维或二维数组来保存之前的计算结果&#xff08;可以进一步降维优化&#xff09; 将当前问题 分解成子问题 &#xff0c;找出递归公式&#xff0c;分阶段进行求解 求解过程中…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

第十五课,海龟画图:抬笔与落笔函数、画曲线函数

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起与落下画笔函数 当使用上节课学习的这个turtle.forward()&#xff1a;画笔前进函数时&#xff0c;画笔会朝着当前方向在画布上留下一条指定&#xff08;像素&#xff09;长度的直线&#xff0c;但你可能发现&a…

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…

MongoDB~存储引擎了解

存储引擎 存储引擎是一个数据库的核心&#xff0c;主要负责内存、磁盘里数据的管理和维护。 MongoBD的优势&#xff0c;在于其数据模型定义的灵活性、以及可拓展性。但不要忽略&#xff0c;其存储引擎也是插件式的存在&#xff0c;支持不同类型的存储引擎&#xff0c;使用不同…

导线防碰撞警示灯:高压线路安全保障

导线防碰撞警示灯&#xff1a;高压线路安全保障 在广袤的大地上&#xff0c;高压线路如同血脉般纵横交错&#xff0c;然而&#xff0c;在这看似平静的电力输送背后&#xff0c;却隐藏着不容忽视的安全隐患。特别是在那些输电线路跨越道路、施工等区域的路段&#xff0c;线下超…

顶点着色技术在AI去衣中的作用

在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶汽车&#xff0c;再到在线购物推荐。然而&#xff0c;AI的影响远不止于此。近年来&#xff0c;AI在图像处理和计算机视觉领域的应用取得了显著进…

【Python系列】Python 中方法定义与方法调用详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

详细介绍运算符重载函数,清晰明了

祝各位六一快乐~ 前言 1.为什么要进行运算符重载&#xff1f; C中预定义的运算符的操作对象只能是基本数据类型。但实际上&#xff0c;对于许多用户自定义类型&#xff08;例如类&#xff09;&#xff0c;也需要类似的运算操作。这时就必须在C中重新定义这些运算符&#xff…

短信发送验证码及邮件发送验证码

发送短信验证码 阿里云发送验证码 public Integer sendTelCode(String tel) {String url "https://dfsns.market.alicloudapi.com/data/send_sms";String appcode "a3198282fbdf443d97aa9f3cfbe1232e";int code RandomUtil.randomInt(1000,10000);emai…