SpringBoot外化配置源码解析:综合实战演示参数及配置( 二 )


比如 , 在 applcation.properties 中进行公共配置 ,然后通过如下配置激活指定环境的配置 。
spring. profiles.active = prod其中“prod”对照文件名中 application-prod.properties 。 Spring Boot 在处理时会获取配置文件 applcation.properties, 然 后 通 过 指 定 的 profile 的 值 “prod" 进 行 拼 接,获 得application-prod.properties 文件的名称和路径 。具体加载拼接的步骤和原理 , 我们在前面的章节中已经讲过 , 可对照实例回顾一下 。
在上述实例中 , 我们激活了 dev 的配置环境 , application-dev.properties 中的配置如下 。
#测试环境用户名和账户user. username=test - adminuser. password=test-pwd此时 , 通过访问对应的请求 , getConfigParams 方 法中对应打印的日志如下 。
Application configUsername : test- adminApplication config Password : test - pwd如果想激活生产环境的配置 , 只须在 application.properties 中配置spring.profiles. active=prod 即可 。
@Value 参数值的获取和基于 Profile 的参数配置我们就拓展这么多 , @Value 的使用还包括注入普通字符串、操作系统属性、表达式结果、文件资源、URL 资源等内容 , 大家可查阅官方文档和相关实例进一步学习 。
在上述@Value 使用中 , 我们可以对单个属性进行注入配置 , 但如果有很多配置属性或者配置属性本身拥有层级结构 , 便显得不够方便灵活 。 因此 , Spring Boo 提供了基于类型安全的配置方式 。
在 ConfigController 中我们通过@Resource 注入了一个 LoginUserConfig 类 , 该类便是通过@ConfigurationProperties 注解将 properties 属性和 LoginUserConfig 的属性进行关联 , 从而实现类型安全配置 。 LoginUserConfig 的源码如下 。
@Component@Configurat ionProperties(prefix = "user")public class LoginUserConfig {private String username ;private String password;//省略 getter/setter 方法}在 LoginUserConfig 类的源代码中 , 通过@ConfigurationProperties 注解指定在实例化时将前缀为 user 的配置属性绑定到 LoginUserConfig 类的对应属性上 , 而通过@Component将该类实例化 。
这 里 由 于 指 定 配 置 文 件 为 dev,则 会 将 上 述 dev 配 置 文 件 中 的 user.username 和user.password 的值分别绑定到 LoginUserConfig 类的 username 和 password 属性上 。 而在 ConfigController 中注入 之后 ,便可获 得对应的属 性值 。 同样在 执行请求时, getConfigParams 方法中对应打印的日志如下 。

  • ConfigurationProperties config Username : test - admin
  • ConfigurationProperties config Password : test- pwd
上述实例只演示了@ConfigurationProperties 绑定属性的一种情况 , Spring Boot 将 Environment 属性绑定到@ConfigurationProperties 标注的 Bean 时 , 还可以使用一些宽松的规则 , 也就是说 Environment 属性名和 Bean 属性名不需要精确匹配 。
比如在对象 User 中有一-个 firstName 属性 , 那么在配置文件中对应如下配置项均会匹配 。
  • user. firstName // 标准驼峰命名语法
  • user. first-name // 短横线隔开表示 , 推荐用于. properties 和. yml 文件中
  • user. first_ name // 下划线表示 , 用于. properties 和 yml 文件的可选格式
  • USER_ FIRST _NAME //大写形式 , 推荐用于系统环境变量
同时 , 基于类型安全的属性配置还可以结合@Validated 注解进行属性的约束校验 , 比如判断是否非空、是否是正确的手机号(邮箱)格式、是否是正确的日期等 , 这里就不进行展开了 。
大家可以结合本实例尝试拓展 。
最后 , 我们再整体回顾一-下本节实例的重 点内容 , 首先基于 Profile 机制我们设定了多个环境的配置文件;然后通过 spring. profiles. active 配置指定具体使用哪些环境的参数值;接着通过@Value 和@ConfigurationProperties 注解将这些配置属性绑定到类属性或 Bean 对象上;最后在具体的场景中获取并使用(本实例为打印) 。
在具体实践中我们还会遇到优先级的问题 , 比如某些参数直接通过命令行参数进行指定 , 那么它将覆盖同名的配置文件中的参数 。 再比如 , 如果将 application 配置文件放置在项目同级目录下 , 它的优先级高于 jar 包内的配置等 。 这些内容我们在原理篇都有涉及 , 读者可参考本实例进行逐一验证学习 。
小结本章重点介绍了 Spring Boot 中参数的传递过程和配置文件的加载 , 特别是基于 profile 的加载机制 。 而关于加载、默认配置、配置优先级等操作 , 都位于 ConfigFileApplicationListener类中 , 该类还是值得读者朋友花时间研究一下的 。
实战部分通过一个简单的实例演示了部分原理的使用方法 , 大家可结合该实例来验证和使用更多的相关功能 。