【Spring Boot】Spring Boot配置文件详情

前言

 Spring Boot是一个开源的Java框架,用于快速构建应用程序和微服务。它基于Spring Framework,通过自动化配置和约定优于配置的方式,使开发人员可以更快地启动和运行应用程序。Spring Boot提供了许多开箱即用的功能和插件,包括嵌入式Web服务器、安全性、数据访问、缓存、测试和监控等,极大地简化了开发人员的工作。同时,Spring Boot还提供了可扩展性和可定制性,让开发人员可以根据特定的需求完全自定义应用程序。本文就 SpringBoot 项目中配置文件的作用以及两种不同形式的配置文件的使用分别进行阐述。
表情包01


文章目录

  • 前言
  • 1 配置文件
  • 2 为什么需要配置文件?
  • 3 properties 格式的配置文件
  • 4 yml 格式的配置文件
    • 4.1 yml 基本语法
    • 4.2 yml 配置不同类型及null
    • 4.3 使用 yml 配置对象
    • 4.4 使用 yml 配置集合
  • 写在最后


1 配置文件

配置文件是一种存储应用程序配置信息的文件,它包含了应用程序所需要的各种参数、选项和设置。
配置

2 为什么需要配置文件?

Spring Boot 配置文件是一个特殊的文件,用来配置 Spring Boot 应用程序的行为。在 Spring Boot 应用程序中,可以使用多种配置文件格式,包括 properties、YAML、XML 等。配置文件通常包含应用程序的参数、数据库连接等信息,可以让应用程序在不同的环境中运行,例如开发、测试、生产等环境。

项目中重要的信息都是在配置文件中去设置的,例如:

  • 数据库的连接信息,包括用户名和密码等;
  • 项目的启动端口;
  • 第三方系统的调用密钥等信息;
  • 用于发现和定位问题的普通日志和异常日志等。

配置文件的作用在于:

  1. 灵活性:通过配置文件,用户可以根据自己的需求来修改应用程序的参数,而不必修改应用程序的代码。

  2. 维护性:将应用程序的参数存储在配置文件中,可以使得维护者更容易理解应用程序的功能和行为。

  3. 共享性:配置文件可以共享给多个用户或多个应用程序使用,从而降低了编写重复代码的工作量。

  4. 安全性:一些敏感信息如数据库连接字符串、密码等可以单独存储在配置文件中,可以防止这些信息被恶意利用或修改。

Spring Boot常见的配置文件有两种:.properties or .yml, 理论上来说,允许两种格式的配置文件可以同时存在。但是,在实际项目开发中,为了可以更好的维护并降低故障发生的概率,我们通常只使用其中一种格式的配置文件。需要特别注意的是,properties 格式的配置的优先级大于 yml 格式的配置文件。
配置文件01

3 properties 格式的配置文件

properties 的语法是用键值对的形式组织的,key 与 value 之间使用 “=” 连接,并不需要多余的空格或者缩进,示例代码如下:

# 端口配置
server.port=8888# 数据库连接配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root# 自定义配置项
myTestConfigName=Huang

如何读取配置文件?
若想要主动读取配置文件的信息,可以使用@Value 注解,该注解使用${} 格式读取,以下代码演示如何读取上述代码中的自定义配置项 myConfigName=Huang

    @Value("${myTestConfigName}")  // 获取自定义配置项private String myTestConfigName;@PostConstructpublic void postConstruct() {System.out.println("myTestConfigName: " + myTestConfigName);}

读取配置文件01

对于初学者来说,properties格式的配置文件由于不需要各种缩进和空格的格式控制,因此,可以避免很多错误。但是,properties格式对中文支持并不好,会出现乱码的情况。其次,由于其是key=value形式存储的,会导致代码有很多冗余信息:
冗余信息
要想解决上述问题,可以使用 yml 格式的配置文件解决~

4 yml 格式的配置文件

YAML(全称 Yet Another Markup Language, 另一种标记语言)是一种层级的、非常易读的标记语言。经常用于不同编程语言之间的数据传输。

  • yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
  • yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
  • yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、JavaScript、Perl 中。

4.1 yml 基本语法

yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使⽤英⽂冒号加空格的⽅式组成的,其中的空格不可省略。

使用 yml 格式配置端口号和数据库连接信息的代码如下:

# 优先级 properties > yml 格式, 但是 yml 格式能够解决中文乱码问题, 并且能够适配多种编程语言
server:port: 8080# 数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8username: rootpassword: root

相较 properties,代码冗余度降低~

4.2 yml 配置不同类型及null

# 字符串
string.value: Hello# 布尔值,truefalse
boolean.value1: true
boolean.value2: false# 整数
int.value1: 77
int.value2: 0b1010_0111_0100_1010_1110 # ⼆进制# 浮点数
float.value1: 3.14159
float.value2: 314159e-5 # 科学计数法# Null~代表null
null.value: ~

需要特别注意的是,字符串类型是否带有引号,读取出来是有区别的~

# 字符串
string:myString1: 你好, \n世界myString2: '你好, \n世界'myString3: "你好, \n世界"

读取配置信息的代码如下:

    @Value("${string.myString1}")private String myString01;@Value("${string.myString2}")private String myString02;@Value("${string.myString3}")private String myString03;@PostConstructpublic void postConstruct() {System.out.println("string.myString1: " + myString01 + "\n" + "string.myString2: " + myString02 + "\n" +"string.myString3: " + myString03 + "\n");}

读取配置信息
可见,只有带有双引号的字符串,转义字符才能被正常解析。对于无引号和单引号的情况,转义字符会原封不动的打印出来~

4.3 使用 yml 配置对象

在 yml 配置对象示例如下:

# 自定义对象
student:id: 1name: "黄小黄"age: 20

也可以采用行内的写法,作用与上述代码一致:

student: {id: 1,name: "黄小黄",age: 20}

如果想要主动读取配置对象的信息,则不能使用 @Value 注解,可以采用 @ConfigurationProperties 来读取,具体实现如下:

@Component
@ConfigurationProperties("student")
@Data
public class Student {private int id;private String name;private int age;
}

在以上代码中,getter、setter以及toString方法均通过lombok实现。需要注意的是@ConfigurationProperties注解中的内容,需要与配置文件中对象的key相同。

调用类的代码如下:

    @Autowiredprivate Student student;@PostConstructpublic void postConstruct() {System.out.println("student: " + student);}

对象的解析

4.4 使用 yml 配置集合

同样地,使用 yml 配置 list 集合也有两种方式:

dbtypes:name:- mysql- sqlserver- db2

行内写法如下:

dbtypes: {name: [mysql,sqlserver,db2]}

与配置集合相同,也可以采用 @ConfigurationProperties 来读取,具体实现如下:

@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {private List<String> name;
}

调用类的代码如下:

@Component
public class ReadListYml {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void postConstruct() {System.out.println(listConfig.getName());}
}

实现结果

更多系统配置项,请查阅官网:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties


写在最后

本文被 JavaEE编程之路 收录点击订阅专栏 , 持续更新中。
 以上便是本文的全部内容啦!创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

在这里插入图片描述

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

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

相关文章

微信小程序 滚动到底部加载新的数据 之后滚动到顶部

1.配置到底部监听 在app.json的window里面加入 里面的300表示距离底部300rpx触发onReachBottom事件 默认50rpx "window": {"onReachBottomDistance": 300}, 2.在数据列表的js页面 /*** 页面上拉触底事件的处理函数*/onReachBottom() {console.log("…

消息中间件面试题详解

RabbitMQ 如何保证消息不丢失 消息的重复消费问题如何解决 rabbitmq中死信交换机&#xff08;RabbitMQ延迟队列有了解吗&#xff09; 延迟队列&#xff1a;进入队列的消息会被延迟消费的队列 场景&#xff1a;超时订单&#xff0c;限时优惠&#xff0c;定时发布 延迟队列 …

【Linux】-第一个小程序(进度条)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作…

真赞!IDEA中可以这么玩MyBatis,让编码速度飞起!

本篇博客图解 MyBatis Generator 的使用过程&#xff0c;并结合实战说明逆向工程的使用方式。 搭建 MyBatis Generator 插件环境 a. 添加插件依赖 pom.xml <!--mybatis 逆向生成插件--> <plugin><groupId>org.mybatis.generator</groupId><artifac…

iPad平板用的触控笔什么牌子好?主动式电容笔推荐

现在&#xff0c;电容笔已经成为在线办公、在线教育等产业中的热门产品&#xff0c;那么&#xff0c;平替电容笔是否会代替苹果原有的电容笔呢&#xff1f;实际上&#xff0c;你根本不需要花那么多钱去买一个原装的苹果电容笔。一支普通的平替式电容笔只需要一两百元&#xff0…

微分方程应用——笔记整理

首先&#xff0c;根据正常思路走&#xff0c;化简得到式子&#xff1a; 不难发现&#xff0c;设 后面得出该方程的通解&#xff1a; 这里要注意什么等于这个通解 --- z 又因为该曲线过点 所以可以求出c为3 该题虽然简单&#xff0c;但是要注意几个问题&#xff0c;该定…

【封装丨工具类】

封装工具类 封装 Java 工具类1. 使用静态工厂方法或静态方法封装实例2.将工具类中的方法进行分组3. 常用方法定义为静态方法或枚举4. 工厂 | 抽象工厂模式5. 访问数据库5.1 JDBC API &#xff1a;5.2 第三方数据库 封装 Java 工具类 1. 使用静态工厂方法或静态方法封装实例 使…

netty学习(2):多个客户端与服务器通信

1. 基于前面一节netty学习&#xff08;1&#xff09;:1个客户端与服务器通信 只需要把服务器的handler改造一下即可&#xff0c;通过ChannelGroup 找到所有的客户端channel&#xff0c;发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

68、基于51单片机语音识别控制小车行走系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 随着电子工业的发展&#xff0c;具有语音控制功能的小车越来越受到人们的青睐&#xff0c;在人们的日常消费生活中起着不可忽视的作用。目前&#xff0c;声控技术已在很多领域得到使用。 本文对语音控制功能的小车概况做了阐述。在硬件设计方面&#xff0c;本论文以凌阳…

LabVIEW评估儿童的运动认知技能

LabVIEW评估儿童的运动认知技能 以前测量认知运动功能的技术范围从基本和耗时的笔和纸技术&#xff0c;到使用准确但复杂和昂贵的实验室设备。Kinelab的主要要求是提供一个易于配置、坚固且便携的平台&#xff0c;以便在向4-12岁的儿童展示交互式视觉刺激期间快速收集运动学测…

blender 之点云渲染(论文渲图)

blender 之点云渲染&#xff08;论文渲图&#xff09; 一、导入点云1.新建2.导入点云3.位置移动&放大缩小 二、Geometry Nodes实体化点云1.新建节点2.实体化 三、给实体化点云添加材质四、设置渲染引擎更换为Cycles。 五、对准视角1.新建一个球2.创建相机视角跟踪3.将uv球挪…

LLM prompt提示构造案例

参考&#xff1a; https://github.com/PlexPt/awesome-chatgpt-prompts-zh 吴恩达 prompt工程应用&#xff1a; https://www.bilibili.com/video/BV1No4y1t7Zn prompt构造案例代码 prompt """文本分类任务&#xff1a;将一段用户给外卖服务的评论进行分类…