SpringBootWeb案例 Part 5

news2025/1/22 12:45:47

4. 配置文件

员工管理的增删改查功能我们已开发完成,但在我们所开发的程序中还一些小问题,下面我们就来分析一下当前案例中存在的问题以及如何优化解决。

4.1 参数配置化

在我们之前编写的程序中进行文件上传时,需要调用AliOSSUtils工具类,将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时,需要一些参数:

  • endpoint // 阿里云OSS域名

  • accessKeyID // 用户身份ID

  • accessKeySecret // 用户密钥

  • bucketName // 存储空间的名字

关于以上的这些阿里云相关配置信息,我们是直接写死在Java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:

  1. 如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐)

  2. 如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,导致不方便集中的管理和维护

思考:怎样将这些参数集中配置管理呢?

回答:Java代码会有很多这毋庸置疑,但是对于SpringBoot项目来说,什么东西一般只有一个?配置文件只有一个,代码当中所有容易变动的参数建议放在配置文件当中进行管理和维护,也就是application.properties。

将参数集中保存/配置在properties配置文件当中的优点:

  1. 在application.properties当中的配置做了修改,我们不用进行编译,而且,所有的配置如果都交给了application.properties配置文件来集中管理,以后如果我们想修改,我们直接找到properties配置文件来做一个修改就可以了,软编码
  2. 其次,安全:敏感的参数(如数据库连接密码)不应该直接硬编码在代码中,而是通过配置文件进行管理,这样可以降低配置泄漏的风险,并更好的保护敏感信息。
  3. 灵活性和可移植性:不同环境的参数配置只需在对应的配置文件中进行修改即可。
  4. 易用性和可读性:将参数配置到配置文件中,使得参数的设置更加直观和易于理解,提高配置文件的可读性和维护性。

注意:这里的配置文件指的可不是pom.xml,pom.xml这份配置文件是Maven项目的配置文件,是用来配置依赖的,而application.properties才是SpringBoot项目的配置文件。

为了解决以上分析的问题,我们可以将参数配置在配置文件中。而application.properties配置文件的形式就是key = value,前面的key可以自己定义,注意在项目开发时,尽量要定义的有一定的业务含义,如下:

问题解决: 

#自定义的阿里云OSS配置信息
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret=4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketName=gch-web-tlias01

注意:

  • 由于properties配置文件当中的信息本身就是一个字符串,所以我们就不需要再来加引号,后面的分号也不需要,等号两边的空格也不需要。

在将阿里云OSS配置参数交给properties配置文件来管理之后,我们的AliOSSUtils工具类就变为以下形式:

/**
 * 使用阿里云OSS进行文件存储的工具类
 */
@Component
public class AliyunOSSUtils {
    /** 以下4个参数没有指定值(默认值:null)*/
    /** 指定连接的阿里云OSS服务的地址 */
    private String endpoint;
    /** 阿里云OSS AccessKey */
    private String accessKeyId;
    private String accessKeySectre;
    /** 存储空间Bucket的名称 */
    private String bucketName;

    //省略其他代码...
}

此时如果直接调用AliOSSUtils类当中的upload方法进行文件上传时,这4项参数全部为null,原因是因为并没有给它赋值。

此时我们是不是需要将配置文件当中所配置的属性值读取出来,并分别赋值给AliOSSUtils工具类当中的各个属性呢?那应该怎么做呢?

想法:IO流,通过IO流读取并解析配置文件当中配置项的值,然后再给成员变量赋值。          

因为application.properties是springboot项目默认的配置文件,所以SpringBoot程序在启动时会默认读取application.properties配置文件,而我们可以使用SpringBoot提供一个的现成的注解:@Value获取配置文件中的数据。  

  • @Value 注解通常用于外部配置的属性注入,具体用法为: @Value("${配置文件中的key}")  
  • 通过@Value注解进行属性注入,将外部的属性配置注入进来赋值给成员变量,在@Value注解当中来指定我们要注入的是配置文件当中的哪一个Key对应的属性值。
/**
 * 使用阿里云OSS进行文件存储的工具类
 */
@Component
public class AliyunOSSUtils {
    /** 指定连接的阿里云OSS服务的地址 */
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    /** 阿里云OSS AccessKey */
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    /** 存储空间Bucket的名称 */
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;
}

总结:

  • 如果在项目开发当中,我们需要用到一些技术或者是服务,我们就可以把这个技术或者是服务它在运行时所需要的参数直接配置在配置文件当中,交给配置文件进行统一的管理和维护,然后在程序当中我们就可以通过@Value注解来注入对应的外部配置的属性值。

4.2 yml配置文件

  • 全新格式的配置文件 - yml配置文件 

在SpringBoot项目当中,是支持多种配置方式的,前面我们一直使用SpringBoot项目创建完毕后自带的application.properties配置文件进行属性的配置,properties配置文件的配置形式就是键值对Key=Value,等号之前是Key,等号之后是Value,那其实呢,在SpringBoot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件,就是我们接下来要学习的yml格式的配置文件

  • yml格式的配置文件,它的后缀可以是yml(推荐),也可以是yaml,这两个配置文件它的配置形式都是相同的,仅仅是后缀名不同而已。
  • 如果是yml格式的配置文件,配置文件的名字也必须叫做application.yml。

yml 格式的配置文件,后缀名有两种:

  • yml (推荐)

  • yaml

SpringBoot提供了多种属性配置方式 / SpringBoot所支持的配置文件

  • application.properties

    server.port=8080
    server.address=127.0.0.1
    
  • application.yml

    server:
      port: 8080
      address: 127.0.0.1
  • application.yaml

    server:
      port: 8080
      address: 127.0.0.1
  • 可以看到,在SpringBoot当中所支持的这三种配置文件,配置文件的名字都是相同的,都叫applictaion,只是文件扩展名不同而已。
  • 如果是yml格式的配置文件,它的配置形式是键值对Key:Value,而且这个Key还是按照层级书写的,相比于传统的properties格式,YAML格式的配置文件使用缩进和结构化语法来表示数据的层级关系。
  1. 层级结构:YAML配置文件使用缩进来表示层级关系,前面的缩进相同,代表它们的层级也相同。比如我们要配置服务器运行的端口号:server.port,

  • 在上面的示例中,porthost 和 timeout 是 server 的子属性它们位于不同的缩进级别

2. 键值对:YAML 使用冒号(:)来表示键值对。冒号后面是一个空格,然后是相应的值。

  • 在上面的示例中,urlusername 和 password 是 database 的子属性。

3. 列表:YAML 支持表示列表数据的方式,使用短横线(-)表示列表中的项目。

  • 在上面的示例中,fruits 是一个包含三个元素的列表。 

4. 注释:使用井号(#)表示注释。井号后面的内容将被视为注释,不会被解析。

  • 在上面的示例中,井号后面的内容是注释,不会影响配置的读取和解析。 

这些是 YAML 配置文件的一些常见形式。通过使用缩进、键值对、列表和注释等语法规则,YAML 配置文件可以更清晰和易读地表示数据的结构和层级关系。

在SpringBoot的resources目录下来创建一份儿applictaion.yml格式的配置文件,创建后可以看到,在我们所创建出来的application.yml格式的配置文件前面多了一个SpringBoot的Logo,这就说明SpringBoot是识别这份配置文件的。 

application.yml

演示:输入server之后给出自动提示,我们要配置的是SpringBoot内嵌的Tomcat服务器运行的端口号,默认是8080,我们可以修改内嵌的Tomcat服务器端口号为9000:

 

常见的三类配置文件格式的优缺点对比:  

  • XML配置文件当中,我们要定义很多的标签,既要定义开始标签,又要定义结束标签,既有父标签,也有子标签,虽然层级结构比较清晰,但是配置比较臃肿
  • properties配置文件相对于XML配置文件来说,会更加轻量化一些,它的配置格式是键值对Key=Value,但是,在项目开发当中,我们经常会使用大量的框架以及第三方的技术,而在使用框架时,我们又需要在配置文件当中来配置很多的参数,而在框架当中,为了让这个Key更加的简明知意,并且具有一定的标识意义,所以这个Key通常来说都是分层级的,如果用properties配置文件来配置,那就是平铺直叙层级结构并不清晰,而且这个Key越复杂,层级架构约不清晰,所以properties配置文件相对于XML配置文件来说,它会更加轻量化一些,但是它并没有XML配置文件结构清晰。 
  • 如果采用yml格式来配置,这个层级结构就会更加清晰没有一点儿多余的配置,而且通过该配置结构可以更清晰的表示数据的结构和层级关系,完全以数据为中心,简洁,没有一点儿多余的配置。

在SpringBoot当中,仅支持properties和yml格式的配置,而在现在的企业开发当中,SpringBoot项目基本上采用的都是yml格式的配置文件,很少使用properties,所以,推荐使用yml格式的配置文件。

对于yaml格式的配置文件,我们一般会选择yml这个拓展名,更加简单

我们可以看到配置同样的数据信息,yml格式的数据有以下特点:

  1. - 容易阅读
  2. - 容易与脚本语言交互
  3. - 以数据为核心,重数据轻格式

简单的了解过SpringBoot所支持的配置文件,以及不同类型配置文件之间的优缺点之后,接下来我们就来了解下yml配置文件的基本语法:  

  • 大小写敏感

  • 数值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(对于现在的开发工具来说,使用Tab制表符或者空格无所谓,因为高级开发工具idea中会自动的将yml格式配置文件当中的Tab转换为空格)

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

 

 

注解@ConfigurationProperties 

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

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

相关文章

25岁的健康启程:追逐活力,超越年龄

嗨,亲爱的朋友们!今天,我想与大家分享一个深入人心的话题:年龄与健康。最近,有关大公司裁员,并将35岁定为“体能下滑”的临界点的新闻引发了热议。是不是只要到了35岁,身体就会渐渐变差&#xf…

Go framework-Kratos

一、Go framework 框架Github开源时间开源方Kratoshttps://github.com/go-kratos/kratos2019Bilibiligo-kithttps://github.com/go-kit/kit/2015团队开源go-zerohttps://github.com/tal-tech/go-zero2020团队开源TarsGohttps://github.com/TarsCloud/TarsGo2018腾讯Jupiterhtt…

免费清理电脑:删除垃圾文件以提升电脑性能

求助!电脑上没有可用空间 ​“我只在电脑上存储了大约100张照片,为什么我的硬盘空间已满?电脑运行速度也变得越来越慢,要疯了!现在我想安装更新的驱动程序。我可以释放磁盘空间吗?有免费的Windows电脑清…

数组-C语言(初阶)

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作为函数参数 4.1 数组名 4.2 冒泡排序…

FreeRTOS 查找最高优先级的就绪任务源码分析

一、就绪任务列表 就绪列表 pxReadyTasksLists[ configMAX_PRIORITIES ] 是一个数组, 数组里面存的是就绪任务的 TCB(准确来说是 TCB 里面的 xStateListItem 节点) ,数组的下标对应任务的优先级,优先级越低对应的数组…

Android studio 点击按钮 (跳转界面)

Android studio 点击按钮 (跳转界面) 问题描述 首先,我们有两个Java文件和与之绑定的xml文件。此处以HistoryActivity.java,activity_history.xml 和 EventDetail.java,activity_event_detail.xml为例子。我们要实现…

05-Numpy基础-用于数组的文件输入输出

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的: 如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过np.load读取磁盘上的数组&#xff1…

NAT网关

NAT网关 NAT网关(NAT Gateway)是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。阿里云NAT网关分为公网NAT网关和VPC NAT网关: ■ 公网NAT网关提供公网地址转换服务 ■ VPC NAT网关提供私网地址转换服务 公网NAT网关 公网NAT网关是一款针对公网访…

Matlab分割彩色图像

彩色图像 彩色图像除有亮度信息外,还包含有颜色信息。以最常见的RGB(红绿蓝)彩色空间为例来简要说明彩色图像: 彩色图像可按照颜色的数目来划分。例如,256色图像和真彩色图像(2的16次方=21677…

解决Android Studio中Plugin version和Gradle version不匹配的问题

生命中最艰难的那段路是要自己一个人走过来的,这样,学到更多的是坚强,而不是感动。 《红猪》 前言 导入一个百度云的Demo而已,居然遇到这么多问题,纠结了很久,也查了很多资料,弯弯绕绕了好多路…

Ae 效果:CC Light Wipe

过渡/CC Light Wipe Transition/CC Light Wipe CC Light Wipe(CC 光线擦除)可以为图层添加指定形状(圆形、门形和方形)的光效,并通过光效形状的开合来实现擦除过渡。 可以为要过渡到的图层添加“曝光度”等效果&#x…

记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题

文章目录 Flask-Migrate迁移数据库失败的两个Bug1、找不到数据库:Unknown database ***2、迁移后没有效果:No changes in schema detected. Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数…

有哪些前端调试和测试工具? - 易智编译EaseEditing

前端开发调试和测试工具帮助开发人员在开发过程中发现和修复问题,确保网站或应用的稳定性和性能。以下是一些常用的前端调试和测试工具: 调试工具: 浏览器开发者工具: 现代浏览器(如Chrome、Firefox、Safari等&#…

Kali个人初始配置

1、修改root密码 sudo passwd root 2、kali换国内源 vim /etc/apt/sources.list,注释掉默认的官方源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib# …

JavaScript箭头函数

Arrow Functions(箭头函数)是 ES6 中引入的一种新的函数表达式语法,它可以更简洁地定义函数,并且不需要像普通函数一样使用 function 关键字。 例如我们上节课的代码: const peopleAge function calcAge1(birthYear)…

idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案

项目场景: 项目场景:使用idea创建maven项目时,导入简单依赖时(本文以mysql-connector-java为例)。 问题描述 问题: 首先,在创建新的maven项目中,出现下列两种情况: &am…

读SQL学习指南(第3版)笔记05_过滤

1. 不需要考虑排除任何列 1.1. 清除数据表中所有的内容 1.2. 暂存新数据仓库的数据 1.3. 向数据表中新添一列后 1.4. 修改数据表中的所有行 1.5. 检索消息队列表中的所有行 2. where子句 2.1. 可以在其中指定一个或多个过滤条件,用于限制SQL语句处理的行数 …

Session 认证机制

什么是 Cookie Cookie 是存储在用户浏览器中的一段不超过 4 KB 的字符串。它由一个名称(Name)、一个值(Value) 和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。 不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前…

destoon8.0自媒体类型综合资讯门户模板

随着时代发展,自媒体资讯适合当前的互联网情形。呕心沥血开发的一套自媒体综合门户网站模板,本模板采用纯手写开发,带会员中心。首页,列表页,内容页,搜索页面精心编写,非常大气,并配…

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源:https://tianfeng.space/1240.html 书接上文:(上) 插件推荐 1.lobe theme lobe theme是一款主题插件,直接可以在扩展安装 界面进行了重新布局,做了一些优化,有兴趣的…