Spring Boot 配置文件详解:从基础语法到 YAML 配置

一、配置文件是什么?为什么需要配置文件?

1 什么是硬编码?

先看一个例子:

假设我们现在需要编写一个 Java 程序,规定用户访问服务器时使用的端口号为 8080。

我们可能会直接在代码中写:

java 复制代码
public class Server {

    public void start() {
        int port = 8080;

        System.out.println("服务器启动,端口号:" + port);
    }
}

这里的 8080 就直接写在了程序代码里面。

如果以后我们想把端口号修改为 9090,就必须修改 Java 代码,然后重新编译、打包、部署。

这种将数据直接写在程序代码中的方式,就叫作硬编码。

硬编码:

  • 数据直接写在程序源代码中。

  • 修改数据通常需要修改代码。

  • 程序的配置和业务逻辑混在一起。

  • 不方便统一管理。

2 为什么需要配置文件?

现在我们换一种方式。

不再将端口号直接写在 Java 代码中,而是把它放在配置文件里面。

例如:

复制代码
server.port=8080

Java 程序启动时,读取配置文件中的端口号。

如果以后需要修改端口,只需要修改配置文件:

复制代码
server.port=9090

Java 业务代码不需要修改。

这就是配置文件的核心作用:

将程序中可能发生变化的信息,从程序代码中独立出来,统一放在配置文件中进行管理

3 Spring Boot 中有哪些信息需要配置?

在实际 Java 后端项目中,有很多信息不适合直接写死在 Java 代码中。

例如:

① 项目启动端口

Spring Boot 内置了 Tomcat 服务器,默认端口号是 8080。

但是如果电脑上的 8080 端口已经被其他程序占用,就需要修改端口号。

② 数据库连接信息

例如:

  • 数据库地址。

  • 数据库名称。

  • 数据库用户名。

  • 数据库密码。

不同项目连接的数据库可能不同,因此需要支持用户自行配置。

③ 第三方系统调用密钥

例如调用第三方支付平台、短信平台时,需要使用对应的密钥。

④ 日志配置

项目运行时可能需要记录普通日志、异常日志,方便开发人员排查问题。

这些信息都可以放在配置文件中

二、Spring Boot 配置文件快速入门

1 找到配置文件

在我们创建spring项目的时候,idea已经帮我们创建好了配置文件

Spring Boot 支持三种常见的配置文件格式:

配置文件 说明
application.properties Properties 格式
application.yml YAML 格式
application.yaml YAML 格式

我们要是创建配置文件的话就放在跟application.propertices一个目录下面

并且Properties 的优先级高于 YML

2 Properties 基本语法

Properties 使用的是键值对的方式进行配置。

基本格式:

复制代码
key=value

举个例子:

java 复制代码
# 配置项目端口号
server.port=8080

# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false

spring.datasource.username=root

spring.datasource.password=root

这个点是什么:可以将这个理解为是一个层级,就拿配置端口号的就是server相关的port设置

使用 @Value 读取配置文件

java 复制代码
mykey.key1=bite
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PropertiesController {
    @Value("${mykey.key1}")
    private String key1;
    @RequestMapping("key")
    public String key(){
        return "key:"+key1;
    }
}

@Value表示从配置中获取值并且注入到当前属性

其中${mykey.key1}就是表示我们需要去读取的配置项的名称

Propertices的优缺点

Propertices的优点

代码基本上都可以写在一行,并且通过点这种形式还是比较清楚的理解关系的

Propertices的缺点

配置项比较多的时候,会出现大量重复的内容,就比如DataSource下面有名字,url以及密码这些配置,如果我们要写的话,每一个配置前面都需要写上DataSource

3 YML 配置文件

YML 基本语法

YML 的基础语法:

复制代码
key: value

注意:

key 和 value 之间必须使用英文冒号加空格的方式连接

对比两种写法

Properties 写法:

java 复制代码
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false

spring.datasource.username=root

spring.datasource.password=root

YML 写法:

复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root

YML可以通过换行的格式来表示层级关系,这样可以少些一些代码

YML 配置不同数据类型

YML 不仅可以配置字符串,还可以配置多种数据类型。

① 字符串

复制代码
string:
  value: Hello

表示字符串类型。

② 布尔值

复制代码
boolean:
  value: true
  value1: false

布尔类型只有两个值:

  • true:真。

  • false:假。

③ 整数

复制代码
int:
  value: 10

④ 浮点数

复制代码
float:
  value: 3.14159

⑤ Null 空值

复制代码
null:
  value: ~

这里的 ~ 表示 null。

也可以理解为没有实际的值。

注意:

null 和空字符串不是一回事。

⑥ 空字符串

复制代码
empty:
  value: ''

这里表示一个空字符串。

也就是字符串存在,但是里面没有任何字符

使用 @Value 读取 YML

java 复制代码
string:
  hello: bite
java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReadYmlController {
    @Value("${string.hello}")
    private String hello;
    @RequestMapping("/ymlKey")
    public String key() {
        return "读取到值:" + hello;
    }
}

YML 中单双引号的区别

java 复制代码
string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

其中单引号跟没有引号中的\n就是\n不是换行,但是双引号当中的\n表示换行

YML 配置对象

java 复制代码
student:
  id: 1
  name: Java
  age: 18
java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private int id;
    private String name;
    private int age;
}

当我们希望spring boot将这些配置自动绑定到student对象的多个属性上,就需要用到@ConfigurationProperties这个注解,将yml文件中的student这个配置,一个一个加到我们写得Student类上面,并且一一对应

配置 List 集合

java 复制代码
dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

一个 - 表示一个元素

配置 Map 集合

java 复制代码
maptypes:
  map:
    k1: kk1
    k2: kk2
    k3: kk3

YML 的优缺点

YML 的优点

① 可读性高

YML 使用树形结构组织配置

不需要反复写相同的前缀,结构更加直观

② 支持更多的数据类型

可以直接表达:对象,数组,List,Map

尤其是复杂的层级关系,可以使用缩进来表达

③ 支持多种编程语言

YAML 并不只是 Java 才能使用

Golang、Python、Ruby、JavaScript 等语言也可以使用 YAML 格式

因此它具有比较广泛的应用场景

YML 的缺点

① 不适合编写某些复杂配置文件

② 对格式要求比较严格

相关推荐
SimonKing1 小时前
素笺( local-notes)全面优化,新增功能体验不一样的笔记
java·后端·程序员
何中应1 小时前
【Go-1】变量&常量定义
开发语言·后端·golang
CoderYanger1 小时前
Java EE 进阶:6.SpringBoot 配置文件(第二弹)
java·spring boot·spring·面试·职场和发展·java-ee·程序员创富
code_slave(码畜)1 小时前
微服务架构落地:慢 SQL 治理与连接池调优 —— 守住数据库的最后一道防线
数据库·spring boot·sql·spring cloud·微服务·架构
愚农搬码1 小时前
电子表单、动态表单、表单设计器和表单引擎到底有什么区别?
java·后端
miofly1 小时前
GitHub 今日推荐|agent-desktop:通过无障碍树让 AI 代理直接操作桌面应用
rust·开源·github
挖掘狂人1 小时前
Redis 为什么快?把 "存内存" 这句话拆开看
redis·后端·性能优化
m0_639906941 小时前
SpringBoot 实现大模型统一调度网关|对接 OpenAI、Claude 协议差异与适配方案
java·spring boot·spring
Moment1 小时前
DeepSeek 发布新模型,直接把 Agent 联网搜索的门槛打下来了!
前端·后端