Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,对原有的属性绑定功能做了非常多的改进以帮助我们更容易的在Spring应用中加载和读取配置信息。下面本文就来说说Spring Boot 2.0中对配置的改进。

配置文件绑定

简单类型

在Spring Boot 2.0中对配置属性加载的时候会除了像1.x版本时候那样移除特殊字符外,还会将配置均以全小写的方式进行匹配和加载。所以,下面的4种配置方式都是等价的:

  • properties格式:
spring.jpa.databaseplatform=mysql
spring.jpa.database-platform=mysql
spring.jpa.databasePlatform=mysql
spring.JPA.database_platform=mysql
  • yaml格式:
spring:
jpa:
databaseplatform: mysql
database-platform: mysql
databasePlatform: mysql
database_platform: mysql

Tips:推荐使用全小写配合-分隔符的方式来配置,比如:spring.jpa.database-platform=mysql

List类型

在properties文件中使用[]来定位列表类型,比如:

spring.my-example.url[0]=http://example.com
spring.my-example.url[1]=http://spring.io

也支持使用逗号分割的配置方式,上面与下面的配置是等价的:

spring.my-example.url=http://example.com,http://spring.io

而在yaml文件中使用可以使用如下配置:

spring:
my-example:
url:
- http://example.com
- http://spring.io

也支持逗号分割的方式:

spring:
my-example:
url: http://example.com, http://spring.io

注意:在Spring Boot 2.0中对于List类型的配置必须是连续的,不然会抛出UnboundConfigurationPropertiesException异常,所以如下配置是不允许的:

foo[0]=a
foo[2]=b

在Spring Boot 1.x中上述配置是可以的,foo[1]由于没有配置,它的值会是null

Map类型

Map类型在properties和yaml中的标准配置方式如下:

  • properties格式:
spring.my-example.foo=bar
spring.my-example.hello=world
  • yaml格式:
spring:
my-example:
foo: bar
hello: world

注意:如果Map类型的key包含非字母数字和-的字符,需要用[]括起来,比如:

spring:
my-example:
'[foo.baz]': bar

环境属性绑定

简单类型

在环境变量中通过小写转换与.替换_来映射配置文件中的内容,比如:环境变量SPRING_JPA_DATABASEPLATFORM=mysql的配置会产生与在配置文件中设置spring.jpa.databaseplatform=mysql一样的效果。

List类型

由于环境变量中无法使用[]符号,所以使用_来替代。任何由下划线包围的数字都会被认为是[]的数组形式。比如:

MY_FOO_1_ = my.foo[1]
MY_FOO_1_BAR = my.foo[1].bar
MY_FOO_1_2_ = my.foo[1][2]

另外,最后环境变量最后是以数字和下划线结尾的话,最后的下划线可以省略,比如上面例子中的第一条和第三条等价于下面的配置:

MY_FOO_1 = my.foo[1]
MY_FOO_1_2 = my.foo[1][2]

系统属性绑定

简单类型

系统属性与文件配置中的类似,都以移除特殊字符并转化小写后实现绑定,比如下面的命令行参数都会实现配置spring.jpa.databaseplatform=mysql的效果:

-Dspring.jpa.database-platform=mysql
-Dspring.jpa.databasePlatform=mysql
-Dspring.JPA.database_platform=mysql

List类型

系统属性的绑定也与文件属性的绑定类似,通过[]来标示,比如:

-D"spring.my-example.url[0]=http://example.com"
-D"spring.my-example.url[1]=http://spring.io"

同样的,他也支持逗号分割的方式,比如:

-Dspring.my-example.url=http://example.com,http://spring.io

属性的读取

上文介绍了Spring Boot 2.0中对属性绑定的内容,可以看到对于一个属性我们可以有多种不同的表达,但是如果我们要在Spring应用程序的environment中读取属性的时候,每个属性的唯一名称符合如下规则:

  • 通过.分离各个元素
  • 最后一个.将前缀与属性名称分开
  • 必须是字母(a-z)和数字(0-9)
  • 必须是小写字母
  • 用连字符-来分隔单词
  • 唯一允许的其他字符是[],用于List的索引
  • 不能以数字开头

所以,如果我们要读取配置文件中spring.jpa.database-platform的配置,可以这样写:

this.environment.containsProperty("spring.jpa.database-platform")

而下面的方式是无法获取到spring.jpa.database-platform配置内容的:

this.environment.containsProperty("spring.jpa.databasePlatform")

注意:使用@Value获取配置内容的时候也需要这样的特点

全新的绑定API

在Spring Boot 2.0中增加了新的绑定API来帮助我们更容易的获取配置信息。下面举个例子来帮助大家更容易的理解:

例子一:简单类型

假设在propertes配置中有这样一个配置:com.didispace.foo=bar

我们为它创建对应的配置类:

@Data
@ConfigurationProperties(prefix = "com.didispace")
public class FooProperties {

private String foo;

}

接下来,通过最新的Binder就可以这样来拿配置信息了:

@SpringBootApplication
public class Application {

public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Application.class, args);

Binder binder = Binder.get(context.getEnvironment());

// 绑定简单配置
FooProperties foo = binder.bind("com.didispace", Bindable.of(FooProperties.class)).get();
System.out.println(foo.getFoo());
}
}

例子二:List类型

如果配置内容是List类型呢?比如:

com.didispace.post[0]=Why Spring Boot
com.didispace.post[1]=Why Spring Cloud

com.didispace.posts[0].title=Why Spring Boot
com.didispace.posts[0].content=It is perfect!
com.didispace.posts[1].title=Why Spring Cloud
com.didispace.posts[1].content=It is perfect too!

要获取这些配置依然很简单,可以这样实现:

ApplicationContext context = SpringApplication.run(Application.class, args);

Binder binder = Binder.get(context.getEnvironment());

// 绑定List配置
List<String> post = binder.bind("com.didispace.post", Bindable.listOf(String.class)).get();
System.out.println(post);

List<PostInfo> posts = binder.bind("com.didispace.posts", Bindable.listOf(PostInfo.class)).get();
System.out.println(posts);

代码示例

本文的相关例子可以查看下面仓库中的Chapter2-2-1目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning

Spring Booot 2.0 新特性详解正在连载,点击看看都有哪些解读


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指Offer - 面试题57 - II. 和为s的连续正数序列(滑动窗口)

1. 题目 输入一个正整数 target &#xff0c;输出所有和为 target 的连续正整数序列&#xff08;至少含有两个数&#xff09;。 序列内的数字由小到大排列&#xff0c;不同序列按照首个数字从小到大排列。 示例 1&#xff1a; 输入&#xff1a;target 9 输出&#xff1a;[[…

博士读一半,导师跳槽了!博士生把亲身经历发在了Science上

源 | 微算云平台、知乎有这样一个迫在眉睫的问题&#xff0c;困扰着博士生&#xff1a;导师要跳槽&#xff0c;自己该怎么办&#xff1f;▲图源&#xff1a;知乎同样的&#xff0c;Jessica Toothaker 是匹兹堡大学医学院的一名博士生&#xff0c;也是耶鲁大学的访问学生。在她读…

Spring Boot 2.0正式发布,升还是不升呢?

Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架&#xff0c;不论您是一名初出茅庐的程序员还是经验丰富的老司机&#xff0c;都会对其有一定的了解或使用经验。在现代企业级应用架构中&#xff0c;Spring技术栈几乎成为了Java语言的代名词&#xff0c;那么Sp…

剑指Offer - 面试题66. 构建乘积数组(正反遍历)

1. 题目 给定一个数组 A[0,1,…,n-1]&#xff0c;请构建一个数组 B[0,1,…,n-1]&#xff0c;其中 B 中的元素 B[i]A[0]A[1]…A[i-1]A[i1]…A[n-1]。不能使用除法。 示例: 输入: [1,2,3,4,5] 输出: [120,60,40,30,24]提示&#xff1a; 所有元素乘积之和不会溢出 32 位整数 a.l…

Spring Boot 2.0与Java 9

Java 9发布至今已经有半年之久&#xff0c;Spring Boot对其的支持进度也快接近完成&#xff0c;本文就来整理一下在Java 9上运行Spring Boot的一些要点。 必须使用Spring Boot2.0 在Spring Boot的版本计划中明确说明了2.0版本开始才对Java 9进行支持&#xff0c;而1.x版本暂时…

扩散模型在图像生成领域大火,风头超过GAN?

文 | Zhifeng源 | 知乎首先说说我的背景。我从20年diffusion model刚出来就开始&#xff08;花部分精力&#xff09;做这个问题&#xff0c;到目前已经有了3篇相关paper (DiffWave, FastDPM, PDR), 之后也会将其作为我的主要方向之一。我算是这一领域比较早期的研究者&#xff…

剑指Offer - 面试题50. 第一个只出现一次的字符(unordered_map)

1. 题目 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b"s "" 返回 " "限制&#xff1a; 0 < s 的长度 < 50000来源&#xff1a;力扣&#xff08;LeetCode&…

618大促将至,用AI挖掘差评,零代码实现亿级评论观点情感分析

文 | 卖萌酱马上就要到一年一度的618大促&#xff0c;卖萌酱在添加购物车时&#xff0c;选择困难症又犯了。如今的电商评论区&#xff0c;大量刷单行为淹没了重要的产品评价&#xff0c;有的被淹没在了追评区&#xff0c;有的甚至已经不分好评/中评/差评区了&#xff0c;而是“…

Spring Boot 2.0 新特性和发展方向

以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上&#xff0c; Java 6 和 7 不再支持。 内嵌容器包结构调整 为了支持reactive使用场景&#xff0c;内嵌的容器包结构被重构了的幅度有点大。EmbeddedServletContainer被重命名为WebServer&#xff0c;并且org.springf…

剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)

1. 题目 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1]示例 2&#xff…

Nature:大批学者正在涌向工业界,与国内趋势相反?

文 | 杨净 明敏 发自 凹非寺源 | 量子位Nature最新发文&#xff1a;学术界正刮起一阵离职潮。这当中&#xff0c;处于职业中期的科学家尤甚。而他们的集体归宿&#xff0c;是转向工业界。事实上&#xff0c;这种趋势由来已久。早在2018年一项研究预测显示&#xff0c;高等教育将…

剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

1. 题目 给定一棵二叉搜索树&#xff0c;请找出其中第k大的节点。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4限制&#xff1a; 1 ≤ k ≤ 二叉搜索树元素个数来源&#xf…

Spring Boot中使用LDAP来统一管理用户信息

很多时候&#xff0c;我们在构建系统的时候都会自己创建用户管理体系&#xff0c;这对于开发人员来说并不是什么难事&#xff0c;但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下&#xff0c;如果每个系统维护自己的用户信息&#xff0c;那么此时用户信息的同步…

剑指Offer - 面试题53 - II. 0~n-1中缺失的数字(二分、位运算)

文章目录1. 题目2. 解题2.1 充分利用题目信息2.2 位运算2.3 二分查找1. 题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出…

大厂如何决定裁掉谁?

文 | 祝乐源 | 曲速纪元说明&#xff1a;本文并非以具体某一家大厂为具体描述对象&#xff0c;每家公司有其特殊的流程&#xff0c;因此所描述的流程不一定适合所有公司。只是提供一个大厂裁员的逻辑框架&#xff0c;具体操作上可能存在流程和操作上的节点增加以及前后顺序变化…

Spring Boot中使用Flyway来管理数据库版本

久违了的Spring Boot系列&#xff0c;今天抽空更新一篇。去年写过很多篇关于数据访问的文章了&#xff0c;比如下面这些&#xff1a; 使用JdbcTemplate使用Spring-data-jpa简化数据访问层&#xff08;推荐&#xff09;多数据源配置&#xff08;一&#xff09;&#xff1a;JdbcT…

剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)

1. 题目 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输出: 2示例 2: 输入: nums [5,7,7,8,8,10], target 6 输出: 0限制&#xff1a; 0 < 数组长度 < 50000类似题目&#xff1a;LeetCode 34. 在排序数组中查找元素的第一个…

码农创造了AI,但开发AI不再需要码农了??

马上就要到一年一度的618大促&#xff0c;卖萌酱在添加购物车时&#xff0c;选择困难症又犯了。如今的电商评论区&#xff0c;大量刷单行为淹没了重要的产品评价&#xff0c;有的被淹没在了追评区&#xff0c;有的平台甚至已经不分好评/中评/差评区了&#xff0c;而是“一眼望去…

LeetCode 1351. 统计有序矩阵中的负数

1. 题目 给你一个 m * n 的矩阵 grid&#xff0c;矩阵中的元素无论是按行还是按列&#xff0c;都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目。 示例 1&#xff1a; 输入&#xff1a;grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]] 输出&#xff1a;…

码农创造了AI,但开发AI不再需要码农了

马上就要到一年一度的618大促&#xff0c;卖萌酱在添加购物车时&#xff0c;选择困难症又犯了。 如今的电商评论区&#xff0c;大量刷单行为淹没了重要的产品评价&#xff0c;有的被淹没在了追评区&#xff0c;有的平台甚至已经不分好评/中评/差评区了&#xff0c;而是“一眼望…