【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;

    @PostConstruct
    public 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=utf8
    username: root
    password: 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;

    @PostConstruct
    public void postConstruct() {
        System.out.println("string.myString1: " + myString01 + "\n" + 
                "string.myString2: " + myString02 + "\n" +
                "string.myString3: " + myString03 + "\n");
    }

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

4.3 使用 yml 配置对象

在 yml 配置对象示例如下:

# 自定义对象
student:
  id: 1
  name: "黄小黄"
  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相同。

调用类的代码如下:

    @Autowired
    private Student student;

    @PostConstruct
    public 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 {

    @Autowired
    private ListConfig listConfig;

    @PostConstruct
    public void postConstruct() {
        System.out.println(listConfig.getName());
    }
}

实现结果

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


写在最后

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

在这里插入图片描述

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

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

相关文章

LeetCode 75 —— 62. 不同路径

LeetCode 75 —— 62. 不同路径 一、题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &…

【图像处理】去雾源码收集(halcon、python、C#、VB、matlab)

【图像处理】去雾代码收集&#xff08;附halcon、python、C#、VB、matlab源码&#xff09; 一、halcon算法1.1 halcon算法源码1.2 halcon算法效果图![在这里插入图片描述](https://img-blog.csdnimg.cn/8ad5217a59be4de29b5a7b6eee997b85.png#pic_center) 二、opencv算法2.1 py…

SQL Server数据库 -- 表的创建与管理

文章目录 一、数据表的组成二、创建数据表 表的创建表的查看表的增加表的修改表的删除、三、表的架构操作四、总结 前言 上次博客写到了数据库的创建与管理&#xff0c;但是创建的库里面什么东西都没有&#xff0c;现在我们需要在库里面添加数据表内容 一、数据表的组成 在创…

MySQL:聚合函数(全面详解)

聚合函数 前言一、聚合函数介绍1、AVG和SUM函数2、 MIN和MAX函数3、COUNT函数 二、GROUP BY1、基本使用2、使用多个列分组3、 GROUP BY中使用WITH ROLLUP 三、HAVING1、基本使用2、WHERE和HAVING的对比 四、 SELECT的执行过程1、查询的结构2、SELECT执行顺序3、SQL 的执行原理 …

Presto(Trino)分布式(物理)执行计划的生成和调度

文章目录 1.前言2.物理执行生成(Stage)的生成2.1不同的调度分区策略2.1.1 Connector自己提供的分区策略2.1.2 Presto提供的Partition策略(SystemPartitioningHandle)&#xff1a; 2.2 为Stage创建StageScheduler2.2.1 普通的非bucket表的TableScan StageSplit 放置策略解析 2.2…

Tune-A-Video:用于文本到视频生成的图像扩散模型的One-shot Tuning

Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation Project&#xff1a;https://tuneavideo.github.io 原文链接&#xff1a;Tnue-A-Video:用于文本到视频生成的图像扩散模型的One-shot Tuning &#xff08;by 小样本视觉与智能前沿&…

Nginx-反向代理详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是反向代理 功能介绍配置过程1.修改nginx配置文件修改全局模块修改工作模块修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功 配置反向代理的好处总结提升 概念说明 什么是Nginx Nginx 是一…

Nginx服务器的六个修改小实验

一、Nginx虚拟主机配置 1.基于域名 &#xff08;1&#xff09;为虚拟主机提供域名解析 配置DNS 修改/etc/hosts文件 &#xff08;2&#xff09;为虚拟主机准备网页文档 #创建网页目录 mkdir -p /var/www/html/abc mkdir -p /var/www/html/def ​ #编写简易首页html文件 ec…

89C52RC普中单片机-3

1.LCD1602调试工具 main.c #include<regx52.h> #include "lcd1602.h" void main() {lcd1602_init();//LCD1602初始化();while(1){lcd1602_show_string(0,0,"helloworld");lcd1602_show_string(1,1,"123456.0");} } lcd1602.c #include …

matlab 使用预训练神经网络和SVM进行苹果分级(带图形界面)支持其他物品图片分级或者分类

目录 数据集&#xff1a; 实验代码&#xff1a;alexnet版 如果你的matlab不是正版&#xff0c;先看这里&#xff1a; 数据集结构&#xff1a; 训练代码&#xff1a; 训练结果&#xff1a; 图形界面&#xff1a; 界面展示&#xff1a; 其他&#xff1a; 输出结果: 实验…

Ansible练习

部署ansible练习 开始之前先使用student用户登录 登录命令&#xff1a;ssh studentworkstation 在workstation上运行lab deploy-review start命令&#xff0c;此脚本将确保受管主机在网络上访问。 然后开始验证控制节点上是否安装了ansible软件包&#xff0c;在运行anisble -…

centos磁盘扩容

解释 PE - 物理块&#xff08;Physical Extent&#xff09; 硬盘上有很多实际物理存在的存储块PV - 物理卷 &#xff08;Physical Volume&#xff09; 物理卷处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘(相当于单独做一个分区)&…

GPT模型训练实践(2)-Transformer模型工作机制

Transformer 的结构如下&#xff0c;主要由编码器-解码器组成&#xff0c;因为其不需要大量标注数据训练和天然支持并行计算的接口&#xff0c;正在全面取代CNN和RNN&#xff1a; 扩展阅读&#xff1a;What Is a Transformer Model? ​ ​ 其中 编码器中包含自注意力层和前馈…

LabVIEW 图像处理功能

设置成像系统并采集图像后&#xff0c;您可以分析和处理图像&#xff0c;以提取有关被检测对象的有价值信息。 内容 图像分析图像处理斑点分析机器视觉 图像分析 影像分析结合了基于影像像素的灰度强度计算统计数据和测量的技术。您可以使用影像分析功能来确定影像质量是否足以…

Java单例模式

Java单例模式 1、概念2、代码实现方案饿汉式实现:懒汉式实现:饿汉式PK懒汉式&#xff1a; 3、单例模式的特点及适用场景优点&#xff1a;缺点&#xff1a;适用场景&#xff1a; 4、关于单例模式的常见问题4.1 public static SingletonOne getlnstance(){}A.该方法为什么用静态的…

python爬虫快速入门

Python有其简洁明了&#xff0c;功能强大的优势&#xff0c;特别是在网络爬虫的应用上。接下来&#xff0c;我将分享一个适合Python初学者的爬虫快速入门教程。 一、Python爬虫简介 网页爬虫&#xff0c;是一种自动从互联网上获取信息的程序。在Python语言中&#xff0c;requ…

【Qt】程序异常结束。The process was ended forcefully.(解决方法不一样哦)

环境 系统&#xff1a;win10 64bit Qt&#xff1a;5.14.1 编译器&#xff1a;MinGW 32-bit 问题 Qt工程编译正常&#xff0c;但无法调试&#xff0c;报错&#xff1a;程序异常结束。The process was ended forcefully. 步骤 已尝试网上方法仍然不行的&#xff0c;可以直接…

Visual studio 快捷键(个人记录加深印象)

1、CtrlK 后 Ctrlx 插入代码片段快捷键&#xff08;或 编辑”>“IntelliSense”>“插入代码片段&#xff09; 注&#xff08;摘抄&#xff09;&#xff1a;该列表包含用于创建类、构造函数、for 循环、if 或 switch 语句等的代码片段

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 &#xff08;两种方法&#xff09;&#xff08;又叫制作盲埋孔&#xff09; 1.1 制作热风焊盘 &#xff08;之前的教程有&#xff0c;现在只给数据&#xff09; 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘&#xff0c;查看…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…