如何从零开始学Spring Boot系列并掌握外部化配置?

摘要:Spring Boot 允许你将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。可以使用属性文件、YAML文件、环境变量和命令行参数将配置外部化。属性值可以通过使用 @Value 注解直接注入 bean,可以通过 Spring 的
Spring Boot 允许你将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。可以使用属性文件、YAML文件、环境变量和命令行参数将配置外部化。属性值可以通过使用 @Value 注解直接注入 bean,可以通过 Spring 的 Environment 抽象访问,也可以通过 @ConfigurationProperties。 Spring Boot 使用一种非常特殊的 PropertySource 顺序,其设计目的是允许合理地覆盖值。属性按以下顺序考虑: (1)主目录上的 Devtools 全局设置属性(Devtools 处于活动状态时 ~/.spring-boot-devtools.properties)。 (2)测试中的 @TestPropertySource 注解。 (3)测试中的 properties 属性。在 @SpringBootTest 和测试注解中提供,用于测试应用程序的特定部分。 (4)命令行参数。 (5)来自 SPRING_APPLICATION_JSON(内嵌在环境变量或系统属性中的 JSON)的属性。 (6)ServletConfig 初始化参数。 (7)ServletContext 初始化参数。 (8)来自 java:comp/env 的 JNDI 属性。 (9)Java 系统属性(System.getProperties())。 (10)OS(操作系统)环境变量。 (11)仅在 random.* 中具有属性的 RandomValuePropertySource。 (12)打包的 jar 之外的特定配置的应用程序属性(application-{profile}.properties 和 YAML 变体)。 (13)打包到 jar 内的特定配置的应用程序属性(application-{profile}.properties 和 YAML 变体)。 (14)打包的 jar 之外的应用程序属性(application.properties 和 YAML 变体)。 (15)打包到 jar 内的应用程序属性(application.properties 和 YAML 变体)。 (16)@Configuration 类上的 @PropertySource 注解。 (17)默认属性(通过设置 SpringApplication.setDefaultProperties 指定)。 为了提供一个具体的示例,假设您开发了一个使用 name 属性的 @Component,如下面的示例所示: import org.springframework.stereotype.*; import org.springframework.beans.factory.annotation.*; @Component public class MyBean { @Value("${name}") private String name; // ... } 在应用程序类路径上(例如,在 jar 中)可以有一个 application.properties 文件,为 name 提供一个合理的默认属性值。在新环境中运行时,可以在 jar 外部提供 application.properties 文件,该文件覆盖 name。对于一次性测试,可以使用特定的命令行开关启动(例如,java -jar app.jar --name="Spring")。 提示:SPRING_APPLICATION_JSON 属性可以在带有环境变量的命令行上提供。例如,可以在 UN*X shell 中使用以下行: SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar 在前面的示例中,你在 Spring Environment 中使用 acme.name=test 结尾。你还可以在系统属性中将 JSON 作为 spring.application.json 提供。
阅读全文