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

发布于:2025-03-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

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

4. 使用建议

  1. 选择 application.properties 的场景

    • 项目配置较为简单,不需要复杂的层次结构。
    • 开发团队对 YAML 格式不熟悉,希望快速上手。
    • 需要快速Prototype(原型开发),不希望花费时间在配置文件格式上。
  2. 选择 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 SpringBootDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}

}

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


3.2yml配置的读取

yml配置文件:

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

同理如上:
启动项目:

在这里插入图片描述

可以看到读取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 :

在这里插入图片描述


配置集合

#端口号
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.RestController;

@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 配置文件的加载顺序如下:

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

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

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

yml配置文件

#端口号
server:
  port=9090

properties配置文件

#端口号
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: 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 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 配置文件的优先级

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

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

9.2 动态更新配置

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

9.3 使用随机端口

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


十、 总结

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

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