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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu