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)提供的一组键值对,用于表示关于运行环境和系统配置的信息。
- 获取系统属性
//如果没有找到对应的属性,则返回 `null`
System.getProperty("os.name");
//如果没有找到对应的属性,返回默认值"default_property_value"
System.getProperty("custom.property", "default_property_value");
- 设置系统属性
设置系统属性有两种方式,一种是通过代码进行设置,另一种是通过命令行参数: 在运行 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.json
和org/springframework/boot/spring-boot/2.7.13/spring-boot-2.7.13.jar!/META-INF/spring-configuration-metadata.json
中查看。
外部属性文件
Spring Boot 支持使用外部属性文件来配置应用程序。默认情况下,它会尝试加载bootstrap.properties
或bootstrap.yaml
或 application.properties
或 application.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 文件>默认属性。
这边文章主要介绍了几种常见的属性来源配置方式。下面会针对配置这块出一系列文章,让我们知其然并知其所以然。
计划如下:
- 如何将外部配置信息引入 Spring 应用程序的环境中?有哪些方式,不同类型properties、yaml、json等;
- 自定义属性源,从远程配置中心加载;
- 从多个来源获取属性值并将它们合并到统一的属性源CompositePropertySource;
- SpringBoot对属性配置的抽象,加载属性源码分析。