Spring Boot 教程

外部化配置

Spring Boot 允许将配置外部化(externalize),这样你就能够在不同的环境下使用相同的代码。你可以使用 properties 文件,YAML 文件,环境变量和命令行参数来外部化配置。

使用 @Value 注解,可以直接将属性值注入到 beans 中,然后通过 Spring 的 Environment 抽象或通过 @ConfigurationProperties 绑定到结构化对象来访问。

Spring Boot 设计了一个非常特别的 PropertySource 顺序,以允许对属性值进行合理的覆盖,属性会以如下的顺序进行设值:

  • home 目录下的 devtools 全局设置属性( ~/.spring-boot-devtools.properties)

  • 测试用例上的 @TestPropertySource 注解

  • 测试用例上的 @SpringBootTest 注解

  • 命令行参数

  • 来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中内嵌的内联 JSON)

  • ServletConfig 初始化参数

  • ServletContext 初始化参数

  • 来自于 java:comp/env 的 JNDI 属性

  • Java 系统属性(System.getProperties())

  • 操作系统环境变量

  • RandomValuePropertySource,只包含 random.* 中的属性

  • 没有打进 jar 包的 Profile-specific 应用属性(application-{profile}.properties 和 YAML 变量)

  • 打进 jar 包中的 Profile-specific 应用属性( application-{profile}.properties 和 YAML 变量)

  • 没有打进 jar 包的应用配置(application.properties 和 YAML 变量)

  • 打进 jar 包中的应用配置(application.properties 和 YAML 变量)

  • @Configuration 类上的 @PropertySource 注解

  • 默认属性(使用 SpringApplication.setDefaultProperties 指定)

下面是具体的示例,假设你开发一个使用name属性的 @Component :

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
@Component
public class MyBean {
    @Value("${name}") 
    private String name;
    // ... 
}

你可以将一个 application.properties 放到应用的 classpath 下,为 name 提供一个合适的默认属性值。当在新的环境中运行时,可以在 jar 包外提供一 个 application.properties 覆盖 name 属性。对于一次性的测试,可以使用命令行参数提供 name 属性,去覆盖默认 name 属性。例如:java -jar app.jar --name="Spring"

SPRING_APPLICATION_JSON 属性

SPRING_APPLICATION_JSON 属性可以通过命令行的环境变量设置,例如:

Windows

下面演示在 Win10 系统下面设置 SPRING_APPLICATION_JSON 环境变量,然后在 Spring Boot 程序中读取值。实例:

C:\Users\Administrator\Desktop\demo>echo %SPRING_APPLICATION_JSON%
{"json":"variable value"}
C:\Users\Administrator\Desktop\demo>set SPRING_APPLICATION_JSON={"json":"variable value"}
C:\Users\Administrator\Desktop\demo>echo %SPRING_APPLICATION_JSON%
{"json":"variable value"}
C:\Users\Administrator\Desktop\demo>java -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
 ...

Linux

下面将在 Ubuntu 20 系统下面演示 SPRING_APPLICATION_JSON 环境变量的用法。

(1)直接设置临时 SPRING_APPLICATION_JSON 环境变量,例如:

hxstrive@MS-OYCYMLXUSLLD: demo$ SPRING_APPLICATION_JSON='{"json":"vriable"}' java -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...

(2)通过 -D 选项设置 SPRING_APPLICATION_JSON 变量“spring.application.json”,例如:

hxstrive@MS-OYCYMLXUSLLD: demo$ java -Dspring.application.json='{"json":"vriable"}' -jar demo.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...

(3)通过“--key=value”的形式设置 SPRING_APPLICATION_JSON 变量,例如:

hxstrive@MS-OYCYMLXUSLLD: demo$ java -jar demo.jar --spring.application.json='{"json":"vriable"}'
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)
...
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号