SpringBoot配置加载方式

在开发中,我们经常会和配置打交道,Spring Boot为了方便配置的的管理和加载,提供了灵活的配置文件加载机制。它允许从多个来源中加载应用配置信息。如系统默认配置、外部配置文件、环境变量、命令行参数、数据库、配置中心等。下面介绍几种常见的属性来源配置方式。

命令行参数

Spring Boot 允许您通过命令行参数来覆盖属性值。例如,java -jar app.jar --server.port=8081 可以设置服务器端口为 8081。

//其中args就是用来接收命令行参数的。
public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}

环境变量

Spring Boot 支持通过环境变量来配置属性。环境变量的名称需要遵循一定的规则,如 SERVER_PORT 可用于直接设置服务器端口。

Java系统属性

系统属性是由 Java 虚拟机(JVM)提供的一组键值对,用于表示关于运行环境和系统配置的信息。

  1. 获取系统属性
//如果没有找到对应的属性,则返回 `null`
System.getProperty("os.name");
  
//如果没有找到对应的属性,返回默认值"default_property_value"
System.getProperty("custom.property", "default_property_value");
  1. 设置系统属性

设置系统属性有两种方式,一种是通过代码进行设置,另一种是通过命令行参数: 在运行 Java 程序时,使用 -D 参数来设置自定义系统属性。

  • 通过代码设置系统属性
System.setProperty("a", "bbb");
  • 通过命令行参数设置系统属性
//启动时设置自定义属性
java -Dcustom.property=custom-value -jar app.jar

//启动时设置服务端口
java -Dserver.port=8083 -jar app.jar

常见的系统属性

  • "user.home":用户的主目录。
  • "user.name":用户账号名称
  • user.dir:用户当前工作目录
  • "java.version":Java 运行时环境的版本。
  • "file.separator":文件路径分隔符。
  • "line.separator":行分隔符。
  • "java.home":Java 安装的路径。
  • "os.name":操作系统的名称。
  • "os.arch":操作系统架构
  • "os.version":操作系统版本

默认属性

SpringBoot会自动加载一些默认属性,这些属性可以直接在应用程序中使用。例如:server.port默认属性指定了应用程序的服务器端口。默认属性可以在org/springframework/boot/spring-boot-autoconfigure/2.7.13/spring-boot-autoconfigure-2.7.13.jar!/META-INF/spring-configuration-metadata.jsonorg/springframework/boot/spring-boot/2.7.13/spring-boot-2.7.13.jar!/META-INF/spring-configuration-metadata.json中查看。

外部属性文件

Spring Boot 支持使用外部属性文件来配置应用程序。默认情况下,它会尝试加载bootstrap.propertiesbootstrap.yamlapplication.propertiesapplication.yml 文件。

我们可以在这些文件中定义自定义属性以覆盖默认属性。外部属性文件通常放在应用程序的 classpath中。

外部属性文件可以指定环境 profiles。可根据不同的激活 profile 加载不同的属性文件。例如,application-dev.properties 适用于 dev profile,application-prod.properties 适用于 prod profile。可以使用 spring.profiles.active 属性来设置激活的 profile。

自定义属性文件

我们可以创建自己的属性文件并加载它们。Spring默认只支持加载properties属性文件。可以通过两种方式:一种是通过命令行参数加载,另一种是通过编写代码实现。

命令行加载外部本地properties文件

通过指定 spring.config.location 属性,可以加载外部的属性文件。例如,java -jar app.jar --spring.config.location=/path/to/custom.properties

代码加载外部properties文件

使用@PropertySource注解来加载。

@PropertySource(value = "classpath:custom.properties", ignoreResourceNotFound = true)

从远程配置中心加载

也是通过自定义属性源的方式来实现。后面专门写文章来说明。

属性优先级

Spring Boot 的属性加载具有优先级顺序,高优先级的属性会覆盖低优先级的属性。

属性的优先级从高到低依次为:命令行参数>环境变量>Java系统属性>自定义属性文件>profile-specific 文件>默认属性

这边文章主要介绍了几种常见的属性来源配置方式。下面会针对配置这块出一系列文章,让我们知其然并知其所以然。

计划如下:

  1. 如何将外部配置信息引入 Spring 应用程序的环境中?有哪些方式,不同类型properties、yaml、json等;
  2. 自定义属性源,从远程配置中心加载;
  3. 从多个来源获取属性值并将它们合并到统一的属性源CompositePropertySource;
  4. SpringBoot对属性配置的抽象,加载属性源码分析。
posted @ 2023-08-25 13:46  EndeavourOne  阅读(172)  评论(0编辑  收藏  举报