SpringBoot文档之Externalized Configuration的阅读笔记

  • Reference

  • Core Features

  • Externalized Configuration
    SpringBoot应用可以从properties文件、yaml文件、环境变量、命令行参数中得到配置参数。

    代码里可以使用注解@Value读取配置项的值。

    配置项参数的加载顺序,后加载的属性,可以覆盖已加载的同名属性的值。

    • 默认配置,通过SpringApplication.setDefaultProperties指定参数值。
    • 使用@PropertySource指定参数值的来源。
    • 配置文件,比如application.properties或者application.yaml
    • 操作系统的环境变量。
    • Java的系统变量,即System.getProperties()
    • JNDI方式指定的属性。
    • ServletContext对象配置的参数。
    • ServletConfig对象配置的参数。
    • 使用SPRING_APPLICATION_JSON指定的JSON格式的属性,对应的命令行变量名为spring.application.json
      使用环境变量,样例如下:
      SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar
      
      使用JVM的系统变量,样例如下:
      java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar
      
      使用命令行参数,样例如下:
      java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'
      
    • 命令行参数。
    • 使用@SpringBootTest指定的参数值。
    • 通过使用@DynamicPropertySource,在测试代码中指定参数。
    • 通过使用@TestPropertySource,在测试代码中指定参数。
    • 开发者工具,支持从$HOME/.config/spring-boot中加载配置参数。

    加载配置文件的优先级:

    • Jar文件内的application.properties或者application.yaml

    • Jar文件内的application-{profile}.properties或者application-{profile}.yaml

    • Jar文件外的application.properties或者application.yaml

    • Jar文件外的application-{profile}.properties或者application-{profile}.yaml

      SpringBoot框架加载配置文件时,优先读取properties格式的同名配置文件。

      在启动类的main函数中增加如下代码,将显式禁用命令行参数。

      SpringApplication.setAddCommandLineProperties(false);
      

    SpringBoot框架加载application.properties或者application.yaml时,搜索路径如下:

    • 类路径,根路径。
    • 类路径,config包。
    • jar文件所在目录。
    • jar文件所在目录的子目录config
    • jar文件所在目录的子目录config下的子目录。

    在命令行中增加参数spring.config.name,可以指定配置文件的名称。

    java -jar myproject.jar --spring.config.name=myproject
    

    使用上述样例启动应用程序,SpringBoot框架将搜索并加载配置文件myproject.properties或者myproject.yaml

    在命令行中增加参数spring.config.location,可以指定配置文件的搜索位置,样例如下:

    java -jar myproject.jar --spring.config.location=\
        optional:classpath:/default.properties,\
        optional:classpath:/override.properties
    

    在配置文件名增加前缀optional:,表示假如找不到该位置的配置文件,并不影响应用程序启动,不会导致应用程序启动失败。

    spring.config.additional-locationspring.config.location的用途相同。

    SpringBoot加载配置文件的方案,灵活、强大,可依据业务特点酌情使用,不要花费过多的时间。

    EnvironmentPostProcessor允许在SpringBoot应用启动前修改Environment中定义的属性的值。

    Java Config涉及如下注解:

    • @Value
    • @ConfigurationProperties
    • @Configuration
    • @EnableConfigurationProperties
    • @Validated
    • @Valid
    • @NotNull

    需要结合样例、代码定义,深入理解上述注解的使用方法。