SpringBootWeb案例 Part 5

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: 8080address: 127.0.0.1
  • application.yaml

    server:port: 8080address: 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.rhkb.cn/news/104158.html

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

相关文章

STM32使用PID调速

STM32使用PID调速 PID原理 PID算法是一种闭环控制系统中常用的算法,它结合了比例(P)、积分(I)和微分(D)三个环节,以实现对系统的控制。它的目的是使 控制系统的输出值尽可能接近预…

Facebook HiPlot “让理解高维数据变得容易”

在这个全球信息化的时代,数据量呈爆炸式增长,数据的复杂性也是如此。如何有效地处理高维数据并找到隐藏在其中的相关性和模式是一个严峻的挑战。近年来,可视化和可视化分析已被应用于该任务,并取得了一些积极成果。Facebook的新Hi…

『C语言入门』初识C语言

文章目录 前言C语言简介一、Hello World!1.1 编写代码1.2 代码解释1.3 编译和运行1.4 结果 二、数据类型2.1 基本数据类型2.2 复合数据类型2.3 指针类型2.4 枚举类型 三、C语言基础3.1 变量和常量3.2 运算符3.3 控制流语句3.4 注释单行注释多行注释注释的作用 四、 …

element表格多选实现

表格实现多选 实现表格多选很简单&#xff0c;只需要在表格里加上一列即可&#xff0c;加完之后就会在表格里出现一列白色的四方块按钮&#xff0c;可以多选&#xff0c;也可以单选 <el-table-columntype"selection"width"55"align"center"&…

iOS App逆向之:iOS应用砸壳技术

在iOS逆向&#xff0c;有一项关键的技术叫做“iOS砸壳”&#xff08;iOS App Decryption&#xff09;。自iOS 5版本以来&#xff0c;苹果引入了应用程序加密机制&#xff0c;使得大部分应用都需要进行砸壳操作才能进行逆向分析。因此作为开发者、逆向工程师和安全研究人员都需要…

Python Opencv实践 - 图像直方图自适应均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/cat.jpg", cv.IMREAD_GRAYSCALE) print(img.shape)#整幅图像做普通的直方图均衡化 img_hist_equalized cv.equalizeHist(img)#图像直方图自适应均衡化 #1. 创…

【动手学深度学习】--21.锚框

锚框 学习视频&#xff1a;锚框【动手学深度学习v2】 官方笔记&#xff1a;锚框 1.锚框 目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;gro…

hive问题总结

往往用了很久的函数却只知道其单一的应用场景&#xff0c;本文将不断完善所遇到的好用的hive内置函数。 1.聚合函数或者求最大最小值函数搭配开窗函数使用可以实现滑动窗口 例&#xff1a; SELECT event,time,session_id,COLLECT_LIST(event) OVER (PARTITION BY session_id …

ChatGPT + Flutter快速开发多端聊天机器人App

下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App 下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App

PL 侧驱动和fpga 重加载的方法

可以解决很多的问题 时钟稳定后加载特定fpga ip &#xff08;要不内核崩的一塌糊涂&#xff09;fpga 稳定复位软件决定fpga ip 加载的时序 dluash load /usr/local/scripts/si5512_setup.lua usleep 30 mkdir -p /lib/firmware cp -rf /usr/local/firmare/{*.bit.bin,*.dtbo} …

Flutter实现动画列表AnimateListView

由于业务需要&#xff0c;在打开列表时&#xff0c;列表项需要一个从右边飞入的动画效果&#xff0c;故封装一个专门可以执行动画的列表组件&#xff0c;可以自定义自己的动画&#xff0c;内置有水平滑动&#xff0c;缩放等简单动画。花里胡哨的动画效果由你自己来定制吧。 功…

206.Flink(一):flink概述,flink集群搭建,flink中执行任务,单节点、yarn运行模式,三种部署模式的具体实现

一、Flink概述 1.基本描述 Flink官网地址:Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 2.有界流和无界流 无界流(流): 有定义流的开始,没有定义结束。会无休止…

【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...

全文下载链接&#xff1a;http://tecdat.cn/?p23544 在本文中&#xff0c;长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络&#xff0c;能够学习长期依赖关系&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 本文使用降雨量数据&#xf…

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…

ffmpeg,nginx,vlc把rtsp流转hls

ffmpeg:rtsp>hls流; nginx 托管hls流服务; vlc测试hls流服务; 参考了很多相关文档和资料,由于比较乱就不在一一引用介绍了&#xff0c;下面的是实操OK的例子&#xff1b; 1&#xff09;ffmpeg (ffmpeg-4.4.1-full_build)&#xff0c;要用full版本&#xff0c;否则会缺某些…

华为数通方向HCIP-DataCom H12-821题库(单选题:61-80)

第61题 关于 BGP 的Keepalive报文消息的描述,错误的是 A、Keepalive周期性的在两个BGP邻居之间发送 B、Keepalive报文主要用于对等路由器间的运行状态和链路的可用性确认 C、Keepalive 报文只包含一个BGP数据报头 D、缺省情况下,Keepalive 的时间间隔是180s 答案&#xff…

videojs 实现自定义组件(视频画质/清晰度切换) React

前言 最近使用videojs作为视频处理第三方库&#xff0c;用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现&#xff0c;目前看了许多文章也不全&#xff0c;官方文档写的也不是很详细&#xff0c;自己摸索了一段时间陆陆续续完成了&#xff0c;这是实现后的效果.…

MyBatis分页与特殊字符处理

文章目录 一、分页1.1 分页插件PageHelper1.2 使用1.2.1 导入pom依赖1.2.2 Mybatis.cfg.xml配置拦截器1.2.3. 配置 Mapper.xml1.2.4 测试 二、特殊字符处理2.1 使用CDATA区段2.2 使用实体引用 一、分页 1.1 分页插件PageHelper PageHelper 是 Mybatis 的一个插件。官网 Page…

ios小组件报错:Please adopt containerBackground API

iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…

【云原生】Docker私有仓库 RegistryHabor

目录 1.Docker私有仓库&#xff08;Registry&#xff09; 1.1 Registry的介绍 1.2 Registry的部署 步骤一&#xff1a;拉取相关的镜像 步骤二&#xff1a;进行 Registry的相关yml文件配置&#xff08;docker-compose&#xff09; 步骤三&#xff1a;镜像的推送 2. Regist…