SpringBoot外化配置源码解析:外化配置简介、参数处理

SpringBoot外化配置源码解析在前面章节我们讲解了 Spring Boot 的运作核心原理及启动过程中进行的一系列核心操作 。
从本章开始 , 我们将针对在实践过程中应用的不同知识点的源代码进行解读和分析 , 内容上可能会与之前章节有所重叠 , 但这些重叠的内容更有助于我们在实践和应用中形成前后呼应 , 加深记忆学习效果 。
本章将重点讲解 Spring Boot 外化配置文件相关内容 , 核心包括:外化配置文件、命令行参数、Profile 实现机制及 整个加载处理业务逻辑 。
SpringBoot外化配置源码解析:外化配置简介、参数处理文章插图
外化配置简介Spring Boot 允许我们将配置进行外部化处理 , 以便我们使用相同的代码在不同的环境中运行 。 我们可以使用属性文件、YAML 文件、环境变量和命令参数来进行外化配置 。 这些配置中的属性可以通过@Value 注解直接注入到对应的 Bean 中 , 也可以通过 Spring 的Environment 抽象访问 , 还可以通过@ConfigurationProperties 绑定到结构化的对象上 。
Spring Boot 设计了非常特殊的加载指定属性文件(PropertySource) 的顺序 , 以允许对属性值进行合理的覆盖 。 属性值会以下面的优先级进行设置 。
-home 目 录 下 的 Devtools 全 局 设 置 属 性 (~/.spring-boot-devtools.properties, 条件当devtools 激活时) 。 @ TestPropertySource 注解的测试用例 。

  • . @Spring BootTest#properties 注解的测试用例 。
  • .命令行参数 。
  • .来自 SPRING_ _APPLICATION JSON 的属性(内嵌在环境变量或系统属性中的内联JSON) 。
  • SrvletConfig 初始化参数 。
  • :ServletContext 初始化参数 。
  • java:comp/env 的 JNDI 属性 。
  • Java 系统属性(System.getProperties()。
  • .操作系统环境变量 。
  • : RandomValuePropertySource,只包含 random. *中的属性 。
  • jar 包外的 Profile-specific 应用属性(application-{profile} properties 和 YAML 变量) 。
  • :jar 包内的 Profile-specific 应用属性(application-{profile} properties 和 YAML 变量) 。
  • xjar 包外的应用配置(application properties 和 YAML 变量) 。
  • xjar 包内的应用配置(application.properties 和 YAML 变 量) 。
  • .@Configuration 类上的@ PropertySource 注解 。
  • .默认属性(通过 SpringApplication.setDefaultProperties 指定) 。
在以上配置方式中 , 我们经常使用的包括:命令参数、属性文件、YAML 文件等内容 , 以下将围绕它们的运作及相关代码进行讲解 。
SpringBoot外化配置源码解析:外化配置简介、参数处理文章插图
ApplicationArguments 参数处理ApplicationArguments 提供了针对参数的解析和查询功能 。 在 Spring Boot 运行阶段的章节中 我 们 提 到 过,通 过 SpringApplication.run(args) 传 递 的 参 数 会 被 封 装 在ApplicationArguments 接口中 。 本节我们来详细了解一下 ApplicationArguments 接口 。
接口定义及初始化
首先看一下 ApplicationArguments 接口的具体方法定义及功能介绍(注释部分) 。
public interface ApplicationArguments {//返回原始未处理的参数(通过 appl ication 传入的)String[] getSourceArgs();//返回所有参数名称的集合 , 如参数为: - foo=bar --debug, 则返回[ "foo", "debug"]Set getOpt ionNames();//选项参数中是否包含指定名称的参数boolean containsOpt ion(String name);//根据选项参数的名称获取选项参数的值列表List getOptionValues(String name);//返回非选项参数列表List getNonOpt ionArgs();}通过接口定义可以看出 , ApplicationArguments 主要提供 了针对参数名称和值的查询 , 以及判断是否存在指定参数的功能 。
在 Spring Boot 的初始化运行过程中 , ApplicationArguments 接口的实例化操作默认是通过实现类 DefaultApplicationArguments 来完成的 。
DefaultApplicationArguments 的 底 层 又 是 基 于 Spring 框 架 中 的 命 令 行 配 置 源SimpleCommandLinePropertySource 实 现 的 SimpleCommandLinePropertySource 是PropertySource 抽象类的派生类 。
以下代码中内部类 Source 便是 SimpleCommandLinePropertySource 的子类 。
public class DefaultApplicationArguments implements ApplicationArguments {private final Source source;private final String[] args;public DefaultApplicationArguments(String[] args) {Assert. notNull(args, "Args must not be null");this.source = new Source(args);this.args = args;//在此省略 Appl icat ionArguments 的其他接口实现方法private static class Source extends SimpleCommandL inePropertySource {// ...}}我们再来看 SimpleCommand inePropertySource 的构造方法,通过代码会发现默认使用Spring 的 SimpleCommandLineArgsParser 对 args 参加进行解析 。