【JavaEE15-后端部分】SpringBoot配置文件的介绍

为什么需要配置文件

咱们主要就是解决硬编码的问题,所谓的硬编码,就是将代码给写死了,不灵活。


SpringBoot的配置文件

咱们Spring Boot的中配置文件主要写以下东西:

  • 项⽬的启动端
  • 数据库的连接信息(包含⽤⼾名和密码的设置)
  • 第三⽅系统的调⽤密钥等信息
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等

SpringBoot配置文件的使用

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

此时我在浏览器输入的URL是:http://localhost:8080/user/hello,得到的结果是:


那么接下来我们在配置文件中加入以下的配置信息:

重启服务器之后,我们刚才的访问路径就不再成功:

原因就是我们将端口号变为了9090,所以此时正确的URL路径应该是:http://localhost:9090/user/hello


配置文件的介绍

配置文件有三种格式

  • application.properties
  • application.yml
  • application.yaml

其中yml是yaml的缩写,所以其实核心就只有两个,我们springboot默认的格式是application.properties。


如果properties和yml同时存在怎么办?

如果properties和yml同时存在,那么他们两个同时生效(取并集),而如果在两个配置文件中有冲突的项目,那么以properties为准,它的优先级高于yml。

比如:

在上述两个配置文件中,我们都配置了我们项目的端口号,那么此时我们去启动项目,看他以哪一个端口号为准。

从我们的日志中可以看出,启动项目它的端口是9090那么也就得出了我们这两个配置文件有相同的项目的时候,以properties为主,也就是properties子的优先级大于yml的优先级。


properties配置文件的介绍

properties配置文件的语法

properties配置文件中的内容是以键值对形式存在的。

key和value之间使用等号(=)来分割。

key的建议就是所有的单词用小写,单词之间用点(.)来分割。
例如:

properties 复制代码
# 配置项⽬端⼝号 
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

读取配置文件中的值

首先呢,你需要了解一点,就是说我们的配置文件中所涉及到的配置信息有两个分类,它一类是由spring boot自己去定义的配置信息,那这些配置信息呢由我们springboot自动的读取;【自定义配置信息】而另为一类的配置信息是由我们开发人员自己去设置的配置信息,那么这些配置信息我们就得来学习他如何通过我们程序去读取出来。


自定义配置信息都读取

properties 复制代码
server.port=9090


# 自定义配置信息
my.key=1

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤@Value 注解来实现。
@Value 注解使⽤" ${} "的格式读取,【我们读取值,一般使用的符号都是$】如下代码所⽰:

java 复制代码
@RequestMapping("/prop")
@ResponseBody
@Controller
public class PropertiesController {
    @Value(value = "${my.key}")
    private String myKey;//我的密钥

    @RequestMapping("/v1")
    public String readValue(){
        return "读取到配置文件的值是:" + this.myKey;
    }
}

此时的结果:


详细解释



properties的缺点

1. 类型不安全

所有值都是字符串,需手动转换,易出错。

properties 复制代码
# application.properties
server.port=8080
app.rate=0.95
java 复制代码
@Value("${server.port}")
private String portStr; // 得到字符串"8080",需转int
@Value("${app.rate}")
private String rateStr; // 得到"0.95",需转double
2. 结构扁平,无法表达层级

用点号模拟层级,但本质扁平,长前缀冗余。

properties 复制代码
db.mysql.driver=com.mysql.jdbc.Driver
db.mysql.url=jdbc:mysql://localhost/test
db.mysql.username=root
db.mysql.password=123456
3. 数组/列表配置繁琐

需用下标索引,可读性差。

properties 复制代码
my.servers[0]=192.168.1.1
my.servers[1]=192.168.1.2
my.servers[2]=192.168.1.3
4. 修改后需重启应用

静态文件,运行时修改不生效。

bash 复制代码
# 修改port后必须重启应用才能生效
5. 编码问题

默认ISO-8859-1,中文需转义,可读性差。

properties 复制代码
# 中文会被转义
app.name=\u4e2d\u6587\u540d\u79f0
6. 缺乏校验与文档

纯文本,无类型校验,易写错键名。

properties 复制代码
# 写错键名,编译不报错,运行时才暴露
datasrouce.url=jdbc:mysql://localhost/test  # 应为 datasource

总结:properties简单但功能弱,不适合复杂配置。现代开发更推荐YML(层级清晰、支持列表)或配置中心(动态刷新、统一管理)。


yml配置文件的介绍

yml的语法

1.如果只有一层 键:(冒号) [空格]值

yml是树形结构的配置⽂件,它的基础语法是"key: value".

key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略。

yml 复制代码
key: value

2.如果有多层


yml配置不同数据类型及null

yml 复制代码
# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value: true
boolean.value1: false

# 整数
int.value: 10

# 浮点数
float.value: 3.14159

# Null,~代表null
null.value: ~

# "" 空字符串
empty.value: ''

yml配置信息的读取

和我们的properties是一样,我们配置文件中有些信息是Spring Boot的自动去读的,我们自己写的自定义信息是由我们自己写代码去读的。

yml 复制代码
# 自定义信息
my:
  key1: 10
  key2: true

那么它读取的语法呢,是和我们properties是读取的语法是一样的,也是使用@value注解,例如:

java 复制代码
package com.zhongge.ioc.controller;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;

/**
 * @ClassName YmlController
 * @Description TODO 读取YML配置文件的信息
 * @Author 笨忠
 * @Date 2026-03-05 20:54
 * @Version 1.0
 */
@Controller
public class YmlController {
    @Value(value = "${my.key1}")
    private Integer value1;

    @Value("${my.key2}")
    private Boolean value2;

    @PostConstruct//这个注解作用是在初始化的时候会执行该方法
    public void init() {
        System.out.println("读取到的数值1:" + value1);
        System.out.println("读取到的数值2:" + value2);
    }
}

yml配置对象

配置

yml 复制代码
# 配置对象
person:
  id: 1
  name: 李白
  age: 18

使用:

1.我们写一个person类,首先我们什么都不处理。

java 复制代码
@Data
@Configuration//将该对象交给spring容器管理
public class Person {
    private Integer id;//编号
    private String name;//姓名
    private Integer age;//年龄
}

2.加上@Configuration这个注解,我们将这个person类交给spring IOC容器来管理


3.然后现在我们去容器中取出这个对象,打印出来看它的一个结果。

java 复制代码
	@Autowired
    private Person person;

    @PostConstruct//这个注解作用是在初始化的时候会执行该方法
    public void init() {
        System.out.println(person);
    }

4.可以看出我们得出的值是空的没有值,那么我们想要到配置文件中的值读到这个对象上去。

方法:使用@ConfigurationProperties注解,译为配置属性
代码

java 复制代码
@Data
@Configuration//将该对象交给spring容器管理
@ConfigurationProperties(prefix = "person")//读取配置文件中的对象中的属性
public class Person {
    private Integer id;//编号
    private String name;//姓名
    private Integer age;//年龄
}

最后我们的结果就如下:


yml配置集合和数组

yml配置集合和数组的形式是一样的,所以我们以配置list集合为例
配置文件

yml 复制代码
# 配置集合
dbtypes:        #对象
  name:         #属性
    - mysql     #元素1
    - db2       #元素2
    - sqlserver #元素3

注意事项如图:

我们配置集合和map都是基于对象的,也就是说如图:

读取

读取的方式,我们也是使用@ConfigurationProperties这个注解。

java 复制代码
@Data//目的是帮我们生成get和set方法
@Configuration//目的是让spring自动为我们去创建和管理这个对象【方便我们去获取这个对象】
@ConfigurationProperties(prefix = "dbtypes")
public class DbTypes {
    private List<String> name;
}
java 复制代码
    @Autowired//从spring容器中取出这个值
    private DbTypes dbTypes;
    @PostConstruct//这个注解作用是在初始化的时候会执行该方法
    public void init() {
        System.out.println(dbTypes);
    }

yml配置map集合

配置:注意我们配置都是基于对象【上述有提到过】

yml 复制代码
# 配置map集合
result:
  type:
    success: v1
    fail: v2

读取

读取的方式,我们也是使用@ConfigurationProperties这个注解。

java 复制代码
@Data//会为我们自动加上set和get
@Configuration//spring自动为我们创建和管理这个对象
@ConfigurationProperties(prefix = "result")//读取配置文件中的值
public class Result {
    private Map<String, String> type;
}
java 复制代码
 	@Autowired
    private Result result;
    @PostConstruct//这个注解作用是在初始化的时候会执行该方法
    public void init() {
        System.out.println(result);
    }

结果:


YML 配置文件的优缺点

一、优点
1. 层次结构清晰,可读性强

通过缩进天然表达层级,无需点号前缀,一目了然。

yaml 复制代码
# application.yml
server:
  port: 8080
  servlet:
    context-path: /api

spring:
  datasource:
    url: jdbc:mysql://localhost/test
    username: root
    password: 123456
2. 支持复杂数据类型(列表、映射)

简洁表达数组、集合等。

yaml 复制代码
my:
  servers:
    - 192.168.1.1
    - 192.168.1.2
    - 192.168.1.3
  roles:
    admin: ["read", "write", "delete"]
    guest: ["read"]
3. 多文档块支持(多环境配置)

--- 分隔不同环境,一个文件搞定多环境。

yaml 复制代码
# 默认配置
spring:
  profiles:
    active: dev
---
# 开发环境
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost/dev
---
# 生产环境
spring:
  profiles: prod
  datasource:
    url: jdbc:mysql://prod-server/prod
4. Spring Boot 原生支持,自动绑定到 Java 对象

可直接与 @ConfigurationProperties 配合,类型安全。

yaml 复制代码
app:
  name: MyApp
  version: 1.0.0
  features:
    - feature1
    - feature2
java 复制代码
@ConfigurationProperties(prefix = "app")
@Component
public class AppConfig {
    private String name;
    private String version;
    private List<String> features;
    // getters/setters
}

二、缺点
1. 对缩进严格敏感

空格数量必须一致,混用制表符(Tab)会导致解析失败。

yaml 复制代码
server:
    port: 8080   # 用了4个空格,没问题
  context-path: /api  # 缩进不一致,报错!
2. 不支持制表符(Tab)

只能使用空格,编辑器中容易引入Tab引发诡异错误。

3. 解析性能略低于 properties

YAML 需要解析缩进和复杂结构,比简单键值对的 properties 稍慢,但在大多数应用中可忽略。

4. 复杂嵌套时阅读困难

过深的缩进和嵌套可能让文件变得难以阅读。

yaml 复制代码
# 三层嵌套已经有些晕
a:
  b:
    c:
      d:
        e: value

相关推荐
东离与糖宝2 小时前
OpenClaw + SpringCloud 微服务集成:AI 能力全局复用
java·人工智能
丈剑走天涯2 小时前
kubernetes Jenkins 二进制安装指南
java·kubernetes·jenkins
wuxinyan1232 小时前
Java面试题040:一文深入了解分布式锁
java·面试·分布式锁
弹简特2 小时前
【JavaEE16-后端部分】SpringBoot日志的介绍
java·spring boot·后端
Chan162 小时前
从生产到消费:Kafka 核心原理与实战指南
java·spring boot·分布式·spring·java-ee·kafka·消息队列
廋到被风吹走2 小时前
持续学习方向:云原生深度(Kubernetes Operator、Service Mesh、Dapr)
java·开发语言·学习
HDXxiazai2 小时前
idea JDK17 spring boot+nacos搭建 图文教程
java·spring boot·spring cloud·intellij-idea
泯仲2 小时前
RabbitMQ的延迟消息在项目中的运用及实现剖析
开发语言·后端·rabbitmq