博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot 2.0 外部化配置介绍
阅读量:6177 次
发布时间:2019-06-21

本文共 2520 字,大约阅读时间需要 8 分钟。

简介

在应用中管理配置并不是一个容易的任务,尤其是在应用需要部署到多个环境中时。通常会需要为每个环境提供一个对应的属性文件,用来配置各自的数据库连接信息、服务器信息和第三方服务账号等。通常的应用部署会包含开发、测试和生产等若干个环境。不同的环境之间的配置存在覆盖关系。测试环境中的配置会覆盖开发环境,而生产环境中的配置会覆盖测试环境。Spring 框架本身提供了多种的方式来管理配置属性文件。Spring 3.1 之前可以使用 PropertyPlaceholderConfigurer。Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不同环境和配置文件的方式。不过 Spring 这些配置管理方式的问题在于选择太多,让开发人员无所适从。Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性文件、YAML 文件、环境变量和命令行参数来定义优先级不同的配置值。

<!-- more -->

Spring Boot 可以使用外部化配置来方便在不同环境的运行同样的程序

  • properties 文件
  • YAML 文件
  • 环境变量
  • 命令行参数

内置顺序

Spring Boot 实现了很多PropertySource,按以下顺序,进行合理的相同属性的覆盖:

  1. home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)
  2. 测试用例上的@TestPropertySource注解.
  3. 测试用例上的@SpringBootTest#properties注解。
  4. 命令行参数
  5. 来自SPRING_APPLICATION_JSON的属性(环境变量或系统属性中内嵌的内联JSON)
  6. ServletConfig初始化参数.
  7. ServletContext初始化参数.
  8. 来自于java:comp/env的JNDI属性.
  9. Java系统属性 (System.getProperties()).
  10. 操作系统环境变量.
  11. RandomValuePropertySource,只包含random.*中的属性.
  12. jar包或者war包之外Profile-specific应用属性(application-{profile}.properties和YAML变量).
  13. Jar包内的的Profile-specific应用属性 (application-{profile}.properties and YAML 变量).
  14. Application properties outside of your packaged jar (application.properties and YAML 变量).
  15. Application properties packaged inside your jar (application.properties and YAML 变量).
  16. 配置在@Configuration 类上 注解.
  17. SpringApplication.setDefaultProperties 指定的默认属性

Note:

  • 以上是Spring-Boot内部的默认顺序,并不是绝对顺序,实际扩展的时候需要注意顺序问题,后续我会在实践篇去说明这个。

Spring Boot 1.5 vs 2.0 变化

  1. Relaxed Binding(宽松绑定规则)

    • 属性源绑定规则
Property Note
acme.my-project.person.first-name 建议在 .properties and .yml 文件中使用.
acme.myProject.person.firstName 标准的驼峰命名
acme.my_project.person.first_name 下划线命名, .properties and .yml 文件中使用.
ACME_MYPROJECT_PERSON_FIRSTNAME 大写下划线命名, 在环境变量中使用.

注意

  • 在尽可能的情况下,请使用小写的短横线命名的方法会,比如: my.property-name=acme
  • 在注解@ConfigurationProperties中定义或者在@ConditionalOnProperty的时候属性名前缀的时候必须使用短横分隔命名,并且必须小写,只有注解中命名的时候必须遵守这个命名规则。我发现有些文章描述这个变化是不准确的,并不是所有情况下都是需要这样,比如我可以在配置文件中使用上述表格中的命名方式。
  • RelaxedPropertyResolver 类解析工具被删除掉,由Environment类代替
  • RelaxedDataBinder 类绑定工具类被删除掉,在2.0.0之后使用Binder类,如下使用方式

    MyProperties target = Binder.get(environment)        .bind("app.acme", MyProperties.class)        .orElse(null);FlagType flagType = Binder.get(environment)        .bind("acme.app.my-flag", FlagType.class)        .orElse(FlagType.DEFAULT);
  1. 在2.0之前的版本可以使用get/set方式注入静态变量,2.0以后不再支持
  2. @ConfigurationProperties Validation

    如果在2.0之后的版本需要在@ConfigurationProperties配置的类中使用验证必须使用@Validated注解

  3. Configuration Location

    spring.config.location 属性在2.0之前的版本中会默认增加一个新的文件目录或者文件,在2.0的版本中,如果还要使用之前的功能,请使用spring.config.additional-location

参考

转载地址:http://uvzda.baihongyu.com/

你可能感兴趣的文章
RHEL6 搭建LVS/DR 负载均衡集群 案例
查看>>
以太坊·Rinkeby 测试网络
查看>>
字符串按规则排序算法
查看>>
MPLS + BGP高级特性
查看>>
plist文件读写操作
查看>>
oracle resetlogs和noresetlogs 创建控制文件区别
查看>>
2013-7-17学习作业练习
查看>>
ZAM 3D入门教程(4):Extrusion编辑器
查看>>
《深入实践Spring Boot》一第2章 在Spring Boot中使用数据库2.1 使用MySQL
查看>>
C++语言基础 例程 字符串类
查看>>
堆排序
查看>>
Java的热部署(后期完善)
查看>>
css总结
查看>>
Python学习笔记之六:在VS中调用Python
查看>>
node.js获取参数的常用方法
查看>>
jquery 的 change() 方法的使用
查看>>
本地计算机上的XXX服务启动后又停止了
查看>>
<s:iterator>标签迭代数据不显示
查看>>
判断 SQLServer 触发器类型,支持多行
查看>>
SQL表连接查询(inner join、full join、left join、right join)
查看>>