Spring Boot 配置文件之类型、加载顺序与最佳实践记录

本文主要是介绍Spring Boot 配置文件之类型、加载顺序与最佳实践记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂...

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

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

1.2 application.yml(YAML文件)

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

示例:

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

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

1. application.properties

1.1 优点

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

1.2 缺点

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

2. application.yml

2.1 优点

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

2.2 缺点

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

3. 对比分析

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

4. 使用建议

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

选择 application.yml 的场景:

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

5. 示例对比

5.1 application.properties 示例

server.port=8080
server.servlet.context-path=/myapp
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456
myconfig.appName=My Spring Boot App
myconfig.version=1.0.0

5.2 application.yml 示例

server:
  port: 8080
  servlet:
    context-path: /myapp
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: 123456
myconfig:
  appName: My Spring Boot App
  version: 1.0.0

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

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

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

3.1properties配置的读取

properties配置文件:

#端口号
server.port=9090
#项目名称
spring.application.name=spring-boot-demo
#读取这个配置文件
Mylove.key=you
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;
    }
}
@SpringBootApplication
public class SpringB编程ootDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}
}

启动项目:用浏览器打开 http:127.0.0.1:9090/Mylove/Mylove :

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

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

3.2yml配置的读取

yml配置文件:

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

同理如上:
启动项目:

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

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

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

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

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

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;
}
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 {
    @Autowired
    private Student student;
    @RequestMapping("test")
    private String GetSpringBoot(){
        return student.toString();
    }
}

启动:

@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 配置文件之类型、加载顺序与最佳实践记录

配置集合

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

补充代码进行观察测试:

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 ;
}
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.RestCo编程ntroller;
@RestController
@RequestMapping("yml")
public class SpringBootController {
    @Autowired
    private Lists list;
    @RequestMapping("test")
    private String GetSpringBoot(){
        return list.toString();
    }
}

启动:

@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 配置文件之类型、加载顺序与最佳实践记录

四、 配置文件的加载顺序

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

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

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

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

yml配置文件

#端口号
server:
  port=9090

properties配置文件

#端口号
server.port=8080

我们启动项目看用的是哪个端口号:

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

可以看到用的是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.javascript 配置文件激活

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

spring:
  profiles:
    active: dev

六、 常用配置示例

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

6.1 服务器配置

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

6.2 数据库配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

6.3 日志配置

logging:
  level: INFO
  file:
    name: logs/myapp.log

6.4 自定义配置属性

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

myconfig:
  appName: My Spring Boot App
  version: 1.0.0

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

@Configuration
@Component
public classhttp://www.chinasem.cn MyConfig {
    @Value("${myconfig.appName}")
    private String appName;
    public String getAppName() {
        return appName;
    }
}

七、配置文件的注意事项

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

八、配置文件的加载位置

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

外部文件目录:通过 --spring.config.location 参数指定。

java -jar --spring.config.location=/path/to/config/ myapp.jar

内部类路径:将配置文件放在 src/main/resources 目录下。

外部配置中心:结合 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 配置文件有所帮助!如果有更多问题,欢迎留言讨论。

到此这篇关于Spring Boot 配置文件之类型、加载顺序与最佳实践记录的文章就介绍到这了,更多相关Spring Boot 类型、加载顺序内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Spring Boot 配置文件之类型、加载顺序与最佳实践记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154066

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm