资讯专栏INFORMATION COLUMN

Spring Boot 2.0 外部化配置介绍

lmxdawn / 2103人阅读

摘要:可以使用外部化配置来方便在不同环境的运行同样的程序文件文件环境变量命令行参数内置顺序实现了很多按以下顺序进行合理的相同属性的覆盖目录下的全局设置属性,如果激活测试用例上的注解测试用例上的注解。

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

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

properties 文件

YAML 文件

环境变量

命令行参数

内置顺序

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

home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)

测试用例上的@TestPropertySource注解.

测试用例上的@SpringBootTest#properties注解。

命令行参数

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

ServletConfig初始化参数.

ServletContext初始化参数.

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

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

操作系统环境变量.

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

jar包或者war包之外Profile-specific应用属性(application-{profile}.properties和YAML变量).

Jar包内的的Profile-specific应用属性 (application-{profile}.properties and YAML 变量).

Application properties outside of your packaged jar (application.properties and YAML 变量).

Application properties packaged inside your jar (application.properties and YAML 变量).

配置在@Configuration 类上@PropertySource 注解.

SpringApplication.setDefaultProperties 指定的默认属性

Note:

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

Spring Boot 1.5 vs 2.0 变化

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);

在2.0之前的版本可以使用get/set方式注入静态变量,2.0以后不再支持

@ConfigurationProperties Validation

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

Configuration Location

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

参考

Spring Boot Reference Guide-2.0.3

Spring Boot Reference Guide-1.5.8

Spring Boot 2.0 Configuration Changelog

Relaxed Binding 2.0

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72075.html

相关文章

  • Spring Boot 配置文件中的花样,看这一篇足矣!

    摘要:的默认配置文件位置为。比如,我们需要自定义模块的服务端口号,可以在中添加来指定服务端口为,也可以通过来指定应用名该名字在应用中会被注册为服务名。同时,配置内容都对开发人员可见,本身这也是一种安全隐患。 在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的...

    pingan8787 评论0 收藏0
  • Spring Boot 2.0 @ConfigurationProperties 使用

    摘要:引言的一个便捷功能是外部化配置,可以轻松访问属性文件中定义的属性。本文将详细介绍的使用。 引言 Spring Boot的一个便捷功能是外部化配置,可以轻松访问属性文件中定义的属性。本文将详细介绍@ConfigurationProperties的使用。 配置项目POM 在pom.xml中定义Spring-Boot 为parent org.springframework.boot...

    mating 评论0 收藏0
  • Dubbo Spring Cloud 重塑微服务治理

    摘要:在服务治理方面,相较于而言,并不成熟。遗憾的是,往往被部分开发者片面地视作服务治理的框架,而非微服务基础设施。因此,建议开发人员将或者迁移为服务。因此,下一步需要将其配置服务远程。当服务提供方启动后,下一步实现一个服务消费方。 原文链接:Dubbo Spring Cloud 重塑微服务治理,来自于微信公众号:次灵均阁 摘要 在 Java 微服务生态中,Spring Cloud1 成为...

    wh469012917 评论0 收藏0
  • Dubbo Cloud Native 实践与思考

    摘要:可简单地认为它是的扩展,负载均衡自然成为不可或缺的特性。类似的特性在项目也有体现,它是另一种高性能代理的方案,提供服务发现健康和负载均衡。 Dubbo Cloud Native 实践与思考 分享简介 Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Foundation)项目蓬勃发展之际。Dubbo...

    邱勇 评论0 收藏0
  • Spring Boot 2.0 整合 Thymeleaf 模块引擎

    摘要:如果还在使用以前的版本,想要使用非严格的,需要做以下配置在中引入依赖在中配置更多属性配置请参考中模块的属性介绍。这样的话很好的做到了前后端分离。 本文首发于:https://y0ngb1n.github.io/a/5... 开发环境 org.springframework.boot spring-boot-starter-parent 2.1.0.RELEASE ...

    CoreDump 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<