在Spring Boot 的配置类上使用 @PropertySource 注解指定配置文件。使用配置文件 (比如 application.properties 文件)。通过 random.* 配置的随机属性。操作系统中的环境变量。Java 的系统属性,可通过 System.getProperties() 获得相关内容。java:comp/env 中JNDI 属性。ServletContext 初始化参数(web 环境)ServletConfig 初始化参数(web 环境)SPRING_APPLICATION_JSON 属性,该属性以 JSON 形式存储在系统环境变量中。命令行参数,类似于 java -jar -Denv=DEV 之类。@SpringBootTest 注解,仅在测试中使用。@TestPropertySource 注解,仅在测试中使用。激活 devtools 时,位于 $HOME/.config/spring-boot 下的配置。
如此之多的配置方式,且配置项的来源是多样化的,如何对用户暴露这些配置呢?一种方式就是将所有来源都暴露给用户,用户可以从任意配置源中获得配置。还有一种方式就是由 Spring 管理这些配置源,内部排好优先级,对外暴露统一的 get 方法,用户不需要知道其中的细节。Spring 显然使用了后者。
Spring 使用 PropertySource 来表示一个配置源,PropertySource 有很多子类,比如 SystemEnvironmentPropertySource,PropertiesPropertySource 等等。Spring 将这些 PropertySource 维护在一个列表中,当用户想要获得一个配置的时候,Spring 会遍历这些配置源,依次判断是否有匹配的配置。配置源在列表中的数据其实就代表了优先级。
如下是 Spring 从propertySources 中获得 Property 的方式。
protected