深入探索Spring Boot 配置文件:类型、加载顺序与最佳实践

server/2025/3/19 8:24:59/

目录

  • Spring Boot 配置文件详解
    • 一、Spring Boot 配置文件类型
      • 1.1 `application.properties`(属性文件)
      • 1.2 `application.yml`(YAML文件)
    • 二、`application.properties `和 `application.yml `的优缺点分析
      • 1. `application.properties`
        • 1.1 优点
        • 1.2 缺点
      • 2. `application.yml`
        • 2.1 优点
        • 2.2 缺点
      • 3. 对比分析
      • 4. 使用建议
      • 5. 示例对比
        • 5.1 `application.properties` 示例
        • 5.2 `application.yml` 示例
    • 三、`yml`配置和`properties`配置的读取
      • 3.1`properties`配置的读取
      • 3.2`yml`配置的读取
    • 四、 配置文件的加载顺序
    • 五、 多环境配置
      • 5.1 配置文件命名规则
      • 5.2 激活环境
        • 1. 命令行参数
        • 2. 配置文件激活
    • 六、 常用配置示例
      • 6.1 服务器配置
      • 6.2 数据库配置
      • 6.3 日志配置
      • 6.4 自定义配置属性
    • 七、配置文件的注意事项
    • 八、配置文件的加载位置
    • 九、高级主题
      • 9.1 配置文件的优先级
      • 9.2 动态更新配置
      • 9.3 使用随机端口
    • 十、 总结

Spring Boot 配置文件详解

Spring Boot 是一个基于 Java 的快速开发框架,它通过自动化配置和简化设置,使开发者能够更专注于业务逻辑的实现。配置文件是 Spring Boot 应用配置的核心,通过它我们可以轻松地调整应用的运行环境、功能参数等。本文将详细介绍 Spring Boot 配置文件的使用方法、常见场景及注意事项。

很多项目或者框架的配置信息也放在配置文件中, 比如:
• 项目的启动端口
• 数据库的连接信息(包含用户名和密码的设置)
• 第三方系统的调用密钥等信息
• 用于发现和定位问题的普通日志和异常日志等.


一、Spring Boot 配置文件类型

Spring Boot 支持两种主要的配置文件类型:

1.1 application.properties(属性文件)

properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项目默认的配置文件。

  • 以键值对的形式存储配置信息,简单易读。
  • 适合小型项目或者简单的配置场景。
    properties 是以键值的形式配置的,key 和 value 之间是以"="连接的。
    示例:
    在之前的文章当中,启动时用的端口号是8080,可以通过配置文件来更改端口号:
# 配置项目端⼝号
server.port=9090

在这里插入图片描述


1.2 application.yml(YAML文件)

  • 使用 YAML 格式,结构清晰,适合复杂的配置场景。
  • 支持层级结构和多环境配置,功能更强大。

示例:

# 配置项目端⼝号
server:port: 8080

二、application.properties application.yml 的优缺点分析


1. application.properties

1.1 优点
  1. 简单易学: 基于键值对的形式,语法简单,易于理解和使用,适合新手快速上手。
  2. 轻量级:文件体积小,适合小型项目或简单的配置需求。
  3. 无需额外依赖:Spring Boot 默认支持.properties 文件,无需引入其他依赖。
  4. 错误提示:-在IDE中,.properties 文件的错误提示相对友好,开发者可以快速定位问题。
  5. 历史传统:具有较长的历史,许多开发者已经熟悉其语法和使用方式。

1.2 缺点
  1. 层级结构不足:无法直接通过缩进来表示层级关系,复杂配置时显得冗杂。 需要通过“.”来分隔层级,容易导致配置项过长。
  2. 不支持复杂数据类型:无法直接配置集合、列表等复杂数据类型。如果需要配置集合,需要通过逗号分隔,语法相对繁琐。
  3. 可读性差:对于复杂配置,.properties 文件的可读性较差,难以快速理解配置结构。
  4. 配置项冗长:对于需要层次结构的配置,.properties 文件会显得过于冗长。

2. application.yml

2.1 优点
  1. 层次结构清晰:使用 YAML 格式,通过缩进表示层级关系,配置文件结构清晰,易于理解。适合复杂配置场景,能够直观地表达配置之间的关系。
  2. 支持复杂数据类型:支持列表、字典等复杂数据类型,配置更加灵活。可以直接在配置文件中定义数组、映射等结构。
  3. 可读性强:对于复杂的配置场景,YAML 文件的可读性远超 .properties 文件。通过层次结构,可以快速定位配置项。
  4. 多环境配置便捷: YAML 文件支持多环境配置,通过不同的文件后缀(如 application-dev.yml)轻松实现环境隔离。
  5. 与 Docker.deltaTime 兼容:YAML 格式与 Docker 的配置文件格式类似,方便在微服务场景下使用。

2.2 缺点
  1. 语法要求严格:YAML 文件的缩进、空格等格式要求非常严格,稍有不慎会导致配置加载失败。对于新手来说,需要花时间学习 YAML 的语法规则。
  2. 对大型配置文件的性能影响:由于 YAML 文件的复杂性,加载和解析大型配置文件可能会带来一定的性能开销。
  3. 依赖snakeyaml库:Spring Boot 的 YAML 配置文件依赖于 snakeyaml 库,需要额外引入依赖。
  4. 敏感信息处理复杂:在 YAML 文件中处理敏感信息(如密码)需要额外的配置和加密,操作相对复杂。

3. 对比分析

特性application.propertiesapplication.yml
可读性简单配置可读性高,但复杂配置可读性较差无论简单还是复杂配置,层次结构清晰,可读性强
层次结构无法通过格式表示层次结构,需通过“.”分隔支持层次结构,通过缩进表示
复杂数据类型不支持直接配置复杂数据类型支持列表、字典等复杂数据类型
语法复杂性语法简单,无需学习额外的格式语法较复杂,需要学习 YAML 的基础知识
性能解析速度快,性能开销小对于大型配置文件,解析速度较慢,性能开销大
多环境配置支持多环境配置,但实现相对繁琐多环境配置实现简单,通过文件后缀即可轻松切换
开发成本开发成本低,适合简单项目开发成本稍高,但在复杂项目中更高效

4. 使用建议

  1. 选择 application.properties 的场景

    • 项目配置较为简单,不需要复杂的层次结构。
    • 开发团队对 YAML 格式不熟悉,希望快速上手。
    • 需要快速Prototype(原型开发),不希望花费时间在配置文件格式上。
  2. 选择 application.yml 的场景

    • 项目配置复杂,需要清晰的层次结构。
    • 需要配置复杂数据类型(如列表、字典等)。
    • 项目需要多环境配置,希望通过简单的方式实现环境切换。
    • 项目团队熟悉 YAML 格式,能够快速上手。

5. 示例对比

5.1 application.properties 示例
server.port=8080
server.servlet.context-path=/myappspring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456myconfig.appName=My Spring Boot App
myconfig.version=1.0.0
5.2 application.yml 示例
server:port: 8080servlet:context-path: /myappspring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: 123456myconfig:appName: My Spring Boot Appversion: 1.0.0

从上述示例可以看出,application.yml 的配置文件结构更清晰,层次更分明,易于理解和维护。


三、yml配置和properties配置的读取

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用" ${} "的格式读取

3.1properties配置的读取

properties配置文件:

java">#端口号
server.port=9090
#项目名称
spring.application.name=spring-boot-demo
#读取这个配置文件
Mylove.key=you
java">import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("Mylove")
public class MyController {@Value("${Mylove.key}")private String key;@RequestMapping("getMylove")public String ggetMylove() {return "读取到配置文件的值:"+key;}
}
java">@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}}

启动项目:用浏览器打开 http:127.0.0.1:9090/Mylove/Mylove :
在这里插入图片描述
可以看到读取到了配置文件的值。


3.2yml配置的读取

yml配置文件:

java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置项目文件
Mylove:key1: you1

同理如上:
启动项目:

在这里插入图片描述

可以看到读取yml配置文件的值成功了。


再举几个读取yml配置的例子:
配置对象

java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置对象
student:name: 张三age: 18

这个时候就不能用@Value来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties 来读取,具体实现如下:

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 String name;private int age;
}
java">import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("yml")
public class SpringBootController {@Autowiredprivate Student student;@RequestMapping("test")private String GetSpringBoot(){return student.toString();}
}

启动:

java">@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}}

访问http:127.0.0.1:9090/yml/test :

在这里插入图片描述


配置集合

java">#端口号
server:port=9090
#项目名称
spring:application:name: spring-boot-demo
#配置集合
types:name:- mysql- sqlserver- db2

补充代码进行观察测试:

java">import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;
@Component
@ConfigurationProperties(prefix = "types")
@Data
public class Lists{private List<String> name ;
}
java">import com.slivqers.model.Lists;
import com.slivqers.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("yml")
public class SpringBootController {@Autowiredprivate Lists list;@RequestMapping("test")private String GetSpringBoot(){return list.toString();}
}

启动:

java">@SpringBootApplication
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}}

访问:http://127.0.0.1:9090/yml/test

在这里插入图片描述


四、 配置文件的加载顺序

Spring Boot 配置文件的加载顺序如下:

  1. 当前目录下的 config 目录:优先级最高。
  2. 当前目录下的配置文件:如 application.ymlapplication.properties
  3. 类路径下的 config:用于包内的配置。
  4. 类路径下的配置文件:如 application.ymlapplication.properties
    通过合理规划配置文件的位置,可以实现环境隔离和配置管理。

提出问题
yml配置文件properties配置文件同时存在,那么哪个优先级在前面呢?

我们用个简单的例子进行测试:

yml配置文件

java">#端口号
server:port=9090

properties配置文件

java">#端口号
server.port=8080

我们启动项目看用的是哪个端口号:
在这里插入图片描述

可以看到用的是8080这个端口号,可见当他们两个这个配置文件同时存在时候,properties配置文件的优先级更加高。


五、 多环境配置

在实际开发中,我们通常需要针对不同环境(如开发、测试、生产)配置不同的参数。Spring Boot 支持通过配置文件后缀来实现多环境配置。

5.1 配置文件命名规则

配置文件可以通过添加环境名称作为后缀,创建多个环境配置文件:

  • application.yml:默认配置文件。
  • application-dev.yml:开发环境配置。
  • application-test.yml:测试环境配置。
  • application-prod.yml:生产环境配置。

5.2 激活环境

可以通过以下方式激活特定环境:

1. 命令行参数

在启动应用时,通过 --spring.profiles.active 参数指定环境:

java -jar --spring.profiles.active=dev myapp.jar
2. 配置文件激活

application.yml 文件中直接配置激活环境:

spring:profiles:active: dev

六、 常用配置示例

以下是一些常见的配置场景示例:

6.1 服务器配置

server:port: 8080servlet:context-path: /myapp

6.2 数据库配置

spring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

6.3 日志配置

logging:level: INFOfile:name: logs/myapp.log

6.4 自定义配置属性

application.yml 中添加自定义属性:

myconfig:appName: My Spring Boot Appversion: 1.0.0

在代码中使用自定义属性:

java">@Configuration
@Component
public class MyConfig {@Value("${myconfig.appName}")private String appName;public String getAppName() {return appName;}
}

七、配置文件的注意事项

  1. 配置文件的位置:尽量避免将配置文件放在多个目录中,以免引发配置冲突。
  2. 环境隔离:不同环境的配置文件要明确区分,避免生产环境配置错误。
  3. 敏感信息:不要直接在配置文件中硬编码敏感信息(如密码),建议使用外部配置或加密方式。
  4. 文件格式:YAML 文件的缩进和格式尤为重要,格式错误可能导致应用启动失败。

八、配置文件的加载位置

除了默认的配置文件外,Spring Boot 还支持从以下位置加载配置文件:

  1. 外部文件目录:通过 --spring.config.location 参数指定。
java -jar --spring.config.location=/path/to/config/ myapp.jar
  1. 内部类路径:将配置文件放在 src/main/resources 目录下。

  2. 外部配置中心:结合 Spring Cloud Config 使用外部配置中心。


九、高级主题

9.1 配置文件的优先级

配置文件的加载顺序決定了配置的优先级,后加载的配置会覆盖前面的配置。

加载顺序配置文件路径
1file:./config/
2file:./
3classpath:config/
4classpath:

9.2 动态更新配置

Spring Boot 提供了.DynamicPropertySource功能,可以实现配置的热更新。

9.3 使用随机端口

通过配置 server.port=0 可以让服务器随机分配端口。


十、 总结

Spring Boot 的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效。无论是简单的属性配置,还是复杂的多环境管理,Spring Boot 都提供了便捷的解决方案。在后续的学习中,可以深入探索 Spring Boot 的其他配置高级功能,如动态配置更新、配置文件加密等。

希望本文对你理解Spring Boot 配置文件有所帮助!如果有更多问题,欢迎留言讨论。



http://www.ppmy.cn/server/176192.html

相关文章

人工智能中神经网络是如何进行学习的

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 引言神经网络的学习过程1. 前向传播2. 计算损失3. 反向传播反向传播的步骤 4. 参数更新5. 重…

宜宾数字园区:树莓集团布局的深远意义

树莓集团布局宜宾数字园区&#xff0c;是其深耕数字产业、拓展全国版图的重要一步&#xff0c;具有深远的战略意义。 产业带动效应 宜宾数字园区的建设&#xff0c;有效带动当地数字产业的集聚和发展。通过吸引软件开发、人工智能、大数据等领域的企业入驻&#xff0c;形成较…

在vuejs项目中使用momentjs获取今日、昨日、本周、下周、本月、上月、本季度、上季度、本年、去年等日期

项目场景&#xff1a; 使用了momentjs之后发现这个日期处理控件很强大很方便&#xff0c;参考下面的代码了解详细用法&#xff1a; 官网给出的几种情况(都是当前日期&#xff0c;若指定日期date, moment(date).format()) 使用代码&#xff1a; 项目中日期快捷选择&#xff1a…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

第9章 项目管理概论(一)

9.2 项目基本要素 9.2.1项目基础 项目是为创造独特的产品、服务或成果而进行的临时性工作。 1.独特的产品、服务或成果 可交付成果是指在某一过程、阶段或项目完成时&#xff0c;形成的独特并可验证的产品成果或服务。(可能是有形的&#xff0c;也可能是无形的)。 2.临时性…

基于51单片机的手机拨号键盘模拟proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1rB8GwWyyNnaIP3Kr4d2obw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

人形机器人领域的地位与应用前景分析

此博客主要分析科技迅速发展的今天宇树人形机器人突然爆火&#xff0c;普通科技创业者应该如何应对这样的冲击&#xff0c;如何把握这样的机会。 文章当中仅列举部分场景&#xff0c;还有极其多的应用方向等待开发者研究。 1. 宇树科技的行业地位 1.1 公司发展历程与技术优势…

破解“光伏+储能+充电”一体化难题!安科瑞全方案打造智慧能源新标杆

安科瑞顾强 破解“光伏储能充电”一体化难题&#xff01;安科瑞全方案打造智慧能源新标杆 在“双碳”目标驱动下&#xff0c;光伏储能与充电桩的融合成为能源转型的关键场景。然而&#xff0c;多电源协同、保护逻辑冲突、运维可靠性低等难题&#xff0c;让许多充电站项目陷入…