环境:Spring Boot3.2.5
1. 简介
在Spring Boot中,属性文件通常用于将应用程序配置外部化。这使得我们能够在一个集中位置管理应用程序在不同环境中的具体行为。属性文件可以包含键值对,这些键值对配置应用程序的各个方面,如数据库连接详细信息、日志设置或特定于应用程序的参数。
在本篇文章中,我们将探讨在 Spring Boot 中加载属性文件的7种方法。
2. 实战案例
2.1 在 Spring Boot 中加载属性文件
Spring Boot支持从多个位置获取属性。对于一个普通的应用程序,会按照给定的顺序考虑以下资源:
- 应用程序外部的application.properties / application.yml文件
- 在应用程序内部的application.properties / application.yml文件
- 操作系统环境变量
- Java系统属性
- 命令行参数
当使用Spring配置文件时,应用程序还可以根据激活的配置文件加载特定于配置文件的属性文件。可以通过`spring.profiles.active`属性传递要激活的配置文件。特定于配置文件的`application-{profile}.properties`文件会优先于非特定于配置文件的属性文件。
- 应用程序外的 application-{profile}.properties
- 应用程序外部的application.properties文件
- 应用程序内的 application-{profile}.properties
- 应用程序内的 application.properties
- 操作系统环境变量
- Java 系统属性
- 命令行参数
2.2 应用程序外部加载属性文件
默认情况下,Spring Boot会在项目的`src/main/resources`目录中查找application.properties文件。然而,我们可以使用`spring.config.location`属性来指定application.properties文件的外部位置。
如下,Spring Boot 从指定的外部位置(/home/app/application.properties)而不是默认位置加载 application.properties 文件。
java -jar myapp.jar --spring.config.location=/home/app/application.properties
另一种方法是,我们可以将application.properties文件包含在一个被包含在类路径(classpath)中的目录中。这样做允许我们将application.properties文件与应用程序一起打包,但出于配置的目的,仍然可以将其外部化。
如下,Spring Boot会在类路径中查找位于config目录下的application.properties文件。我们可以将config目录包含在打包后的JAR文件内,或者将其放在JAR文件外部的一个单独目录中。
java -jar myapp.jar --spring.config.additional-location=classpath:/config/
默认其实也是支持从类路径下的/config/中加载配置文件。
2.3 从默认 application.properties 加载属性
默认情况下,Spring Boot会在位于src/main/resources目录下的application.properties或application.yml文件中查找属性。我们可以使用键值对格式直接在这些文件中定义属性。
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=xxxooo
Spring Boot 会自动加载这些文件中的属性,并将其提供给应用程序。
2.4 加载特定于配置文件的属性文件
此外,我们可以使用特定于配置文件的application.properties文件来定制应用程序在不同环境或部署场景下的行为。特定于配置文件的属性文件被命名为application-{profile}.properties,其中{profile}是配置文件的名称。
java -jar myapp.jar --spring.profiles.active=prod
这里,Spring Boot 激活了生产配置文件,并从 application-prod.properties 中加载属性。
2.5 从自定义属性文件中加载属性
我们还可以通过使用@PropertySource注解指定自定义属性文件的位置来从它们中加载属性。这允许我们将配置拆分成多个文件或从外部位置加载属性。
@Configuration
@PropertySource("classpath:pack.properties")
public class CustomConfiguration {
@Value("${pack.app.title}")
private String title ;
}
你可以定义为数组形式加载多个配置文件,也可以使用@PropertySources配置多个。
2.6 通过环境变量传递/覆盖属性
如果我们只考虑一个或两个属性,Spring Boot允许我们使用环境变量来覆盖这些属性。环境变量提供了一种无需修改属性文件即可配置应用程序的方法,从而更容易地在不同环境中管理配置。
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost/mydb
这里的spring.datasource.url属性被SPRING_DATASOURCE_URL环境变量所覆盖。
2.7 通过系统属性传递/覆盖属性
类似于环境变量,我们可以使用系统属性来覆盖属性。系统属性可以使用JVM命令行选项(-Dproperty=value)或在应用程序中通过编程方式设置。
java -jar myapp.jar -Dspring.datasource.url=jdbc:mysql://localhost/mydb
请注意,系统属性具有比属性文件中或环境变量中定义的属性更高的优先级。