Spring Boot 配置加载顺序及属性加载顺序详解

Spring Boot 是一个用于简化 Spring 应用开发的框架,它通过约定优于配置的原则,提供了一种快速构建应用的方法。在开发过程中,常常会用到配置文件和属性值的加载,理解其加载顺序对于优化和调试项目至关重要。

配置加载顺序

Spring Boot 的配置主要来源于多个外部源,这些源包括属性文件、YAML 文件、环境变量、系统属性和命令行参数等。Spring Boot 在启动阶段会按照一定的优先级顺序加载这些配置。下面是加载顺序的整体图示:

PropertiesFile YAMLFile OSEnvironment SystemProperties CommandLineArgs

从上至下,其加载优先级依次为:

  1. 命令行参数(CommandLineArgs)
  2. Java 系统属性(SystemProperties)
  3. 环境变量(OSEnvironment)
  4. YAML 或 Properties 文件(如 application.yml/application.properties)

这意味着在同一级别的配置项中,如果有重复项,后加载的配置项会覆盖前面的配置项。

属性加载顺序

Spring Boot 支持通过 @Value 注解或者 @ConfigurationProperties 注解来注入属性。以下代码演示了如何使用这两种方式来加载配置:

@Configuration
public class AppConfig {
    
    @Value("${app.name}")
    private String appName;

    @Bean
    public Application run() {
        System.out.println("Application Name: " + appName);
        return new Application(appName);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

application.properties 文件中:

app.name=Demo Application
  • 1.

此外,如果你使用 @ConfigurationProperties

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
   private String name;
   
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

在同样的 application.properties 文件中:

app.name=Demo Application
  • 1.

你可以直接使用 @Autowired 来注入 AppProperties,同样可以获取到配置文件中的属性。

关系图

为了更好地理解加载顺序与使用方式之间的关系,下面是一个实体关系图:

CONFIGFILE PROPERTY VALUE APP contains stores uses

在这张图中:

  • CONFIGFILE 代表你的配置文件(如 YAML 或 Properties)。
  • PROPERTY 是配置信息的具体项,比如 app.name
  • VALUE 则是这些属性的具体值,如 “Demo Application”。
  • APP 则是使用了这些配置的应用。

结论

通过上述分析,我们了解到 Spring Boot 的配置加载具有明确的顺序和优先级。当我们理解这些规则后,就能够更有效地管理和优化应用的配置。在实际开发中,利用不同的配置源,可以让我们的应用更灵活,更具可移植性,能够适应多种环境需求。因此,掌握 Spring Boot 的配置加载顺序有助于开发更高效、可维护的应用。