SpringBoot 配置的加载
SpringBoot 配置的加载
SpringBoot配置及环境变量的加载提供许多便利的方式,接下来一起来学习一下吧!
本章内容的源码按实战过程采用小步提交,可以按提交的节点一步一步来学习,仓库地址:https://github.com/zhouweixin/spring-boot-configuration。
环境:
- java: 1.8.0_265
- gradle: 6.6.1
1 准备
用你喜欢的方式创建一个SpringBoot工程,并写一个hello的接口,及相应的集成测试,进行实验吧!
1.1 hello接口代码
HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello world!";
}
}
1.2 hello集成测试代码
HelloControllerTest.java
@SpringBootTest
@AutoConfigureMockMvc
class HelloControllerTest {
@Autowired
MockMvc mockMvc;
@Test
void hello() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("http://localhost:8080/hello"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$", Matchers.is("Hello world!")));
}
}
2 注解@Value
2.1 介绍
@Value通过直接注解在属性上为属性设置
如下所示,为name设置值为tangseng
HelloController.java
@Value("tangseng")
private String name;
2.2 加载配置文件
当然,上面的写法不涉及配置文件的读取,但是从配置文件加载数据也是同样简单
如下所示,在${}中用json的方式设置配置文件中设置的key值
HelloController.java
@Value("${value.string}")
private String valueString;
配置文件的内容为
application.properties
value.string=sunwukong
2.3 数据类型转换
当然,@Value的功能还远不止于此,它可以实现数据类型的转换
即,在配置文件中配置的所有内容是没有数据类型的,@Value会根据属性的类型,实现自动转换
如下所示,基本数据类型@Value注解都是可以正确转换的,使用起来有没有感觉很简单呢?
application.properties
value.int=1
value.float=1.11
value.string=sunwukong
value.bool=true
HelloController.java
@Value("${value.int}")
private int valueInt;
@Value("${value.float}")
private float valueFloat;
@Value("${value.string}")
private String valueString;
@Value("${value.bool}")
private boolean valueBool;
2.4 默认值
写到这里,你肯定认为@Value注解的功能就结束了
然而,并没有,@Value还可以设置默认值
即,假如配置文件中没有配置该属性,也可以有默认值兜底的
默认值的设置格式如下所示
HelloController.java
@Value("${value.double:2.22}")
private double valueDouble;
2.5 时间转换
这次,你一定又一次认为@Value的学习结束了,但是想再分享@Value对时间的处理,因为实际项目中经常会配置超时时间等类似的时间,比较实用
假如配置文件里配置了timeout=60,你认为是60s呢还是60ms,或是60m,是不是有点不清楚呢?
因此,多是配置成timeout=60s, 利用@DurationUnit进行单位的转换
还是看个例子比较直观些
首先配置一个10分钟
application.properties
value.time=10m
然后用秒去解析,看看结果是否正确,这里悄悄告诉你,结果依然是正确的,转成了600s
HelloController.java
@Value("${value.time}")
@DurationUnit(ChronoUnit.SECONDS)
private Duration time;
2.6 集成测试
接下来,写个接口及集成测试,测试一下结果
HelloController.java
@GetMapping("/helloValue")
public Object helloValue() {
Map<String, Object> map = new HashMap<>();
map.put("name", name);
map.put("valueInt", valueInt);
map.put("valueFloat", valueFloat);
map.put("valueString", valueString);
map.put("valueBool", valueBool);
map.put("valueDouble", valueDouble);
return map;
}
HelloControllerTest.java
@Test
void helloValue() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("http://localhost:8080/helloValue"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.is("tangseng")))
.andExpect(MockMvcResultMatchers.jsonPath("$.valueInt", Matchers.is(1)))
.andExpect(MockMvcResultMatchers.jsonPath("$.valueFloat", Matchers.is(1.11)))
.andExpect(MockMvcResultMatchers.jsonPath("$.valueString", Matchers.is("sunwukong")))
.andExpect(MockMvcResultMatchers.jsonPath("$.valueBool", Matchers.is(true)))
.andExpect(MockMvcResultMatchers.jsonPath("$.valueDouble", Matchers.is(2.22)))
.andExpect(MockMvcResultMatchers.jsonPath("$.time", Matchers.is("600s")));
}
当然也可以用请求查看一下结果
$ curl http://localhost:8080/helloValue
{"valueString":"sunwukong","name":"tangseng","valueDouble":2.22,"time":"600s","valueInt":1,"valueFloat":1.11,"valueBool":true}
3 注解@ConfigurationProperties
3.1 介绍
@ConfigurationProperties实现了更加丰富的功能,但是该属性需要配置@ConfigurationPropertiesScan使用
即,首先需要将@ConfigurationPropertiesScan注解到启动类上,即XxxApplication.java
然后便可以利用@ConfigurationProperties上
@ConfigurationProperties是用来注解类上,用来批量从配置文件中加载数据
比如,配置中有如下属性
application.properties
student.name=xiaoming
student.email=123456@qq.com
student.age=18
便可以定义Student类,并将@ConfigurationProperties注解其上
注意:属性名需要和配置文件里对应的名字相同,你肯定观察到了
Student.java
@ConfigurationProperties("student")
public class Student {
private String name;
private String email;
private int age;
// ... 省略setter, getter方法, setter方法必须有
}
3.2 加载集合数据
@ConfigurationProperties除了可以读单值数据,也可以读List和Map数据
比如,配置文件里有如下配置
application.properties
# class.list
student.friends[0]=zhubajie
student.friends[1]=shaheshang
# class.map
student.parent.father=tangseng
student.parent.mother=nverguoguowang
只需要在Student类中再添加两个属性即可,不要忘记setter和getter方法哟
Student.java
private List<String> friends;
private Map<String, String> parent;
添加getStudent接口
HelloController.java
@GetMapping("/getStudent")
public Student getStudent() {
return student;
}
3.3 集成测试
HelloControllerTest.java
@Test
void getStudent() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("http://localhost:8080/getStudent"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.is("xiaoming")))
.andExpect(MockMvcResultMatchers.jsonPath("$.email", Matchers.is("123456@qq.com")))
.andExpect(MockMvcResultMatchers.jsonPath("$.age", Matchers.is(18)))
.andExpect(MockMvcResultMatchers.jsonPath("$.friends[0]", Matchers.is("zhubajie")))
.andExpect(MockMvcResultMatchers.jsonPath("$.friends[1]", Matchers.is("shaheshang")))
.andExpect(MockMvcResultMatchers.jsonPath("$.parent.father", Matchers.is("tangseng")))
.andExpect(MockMvcResultMatchers.jsonPath("$.parent.mother", Matchers.is("nverguoguowang")));
}
直接求观测也是可以的
$ curl http://localhost:8080/getStudent
{"name":"xiaoming","email":"123456@qq.com","age":18,"friends":["zhubajie","shaheshang"],"parent":{"father":"tangseng","mother":"nverguoguowang"}}
SpringBoot 配置的加载的更多相关文章
- SpringBoot在启动时的多环境配置以及加载顺序
通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...
- springboot idea 配置热加载
在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...
- SpringBoot启动如何加载application.yml配置文件
一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...
- SpringBoot配置文件的加载位置
1.springboot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 --file:/config/ - ...
- SpringBoot是如何加载配置文件的?
前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? Sp ...
- springboot 配置文件的加载顺序
springboot 配置文件的加载顺序1.在命令行中传入的参数.2. SPRING APPLICATION JSON中的属性. SPRING_APPLICATION—JSON是以JSON格式配置在系 ...
- Crystal框架配置参数加载机制详解?
前言 定义 配置参数定义的形式 配置参数文件定义在哪里? 配置参数加载的优先级 如何使用配置参数? 最佳实践 Jar项目中如何定义配置参数? War项目中如何定义或重载Jar包中的配置参数? 开发人员 ...
- igmpproxy源代码学习——配置信息加载 loadConfig
在igmpproxy主程序运行之前需要先读取配置文件,igmpproxy的配置文件通常为/etc/igmpproxy.conf或者/var/igmpproxy.conf 其内容如下: ...
- Spring Boot自定义配置与加载
Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...
随机推荐
- html中datalist 是什么??????
<datalist>标签定义选项列表,与input元素配合使用该元素,来定义input可能值.datdallist及其选项不会被显示出来,它仅仅是合法的输入值列表. <input i ...
- cinder-volume服务上报自己的状态给cinder-scheduler的rpc通信代码分析
以juno版本为基础,主要从消息的生产者-消费者模型及rpc client/server模型来分析cinder-volume是如何跟cinder-scheduler服务进行rpc通信的 1.cinde ...
- JavaScript对象原型链的学习
1.构造函数和原型 1.1对象的三种创建方式 字面量方式 var obj = {}; new关键字 var obj = new Object(); 构造函数方式 function Person(nam ...
- 23种设计模式 - 状态变化(Memento备忘录 - State)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...
- Mysql如何将某个字段的值,在原有的基础上+1?
Eg: 电商项目中,需要统计某件商品的购买数量问题,这时产品提了一个bug,告诉你我需要你做一个购买数量统计?你会怎么做呢? 这里我只说我自己的思路,首先是浏览加购物车,创建订单并支付,mq消息消费后 ...
- DHCP和NAT
DHCP(dynamic host configuration protocol)用于内网动态分配IP,是一种基于UDP的应用层协议. NAT(net address translation)用于内网 ...
- [HGAME Week2] Cosmos的博客后台
觉得这道题考察的东西比较综合而且比较简单,就写上了.因为写这篇文章的时候环境已经关闭了,所以引用了其他师傅wp的图片 本题考察了:php://filter伪协议文件包含.var_dump()输出GLO ...
- 小程序开发-block组件的使用
微信小程序中,block不是一个组件,而是一个包装元素,不会在页面中做任何渲染. 使用情况:条件渲染 wx:if 因为 wx:if 是一个控制属性,需要将它添加到一个标签/组件上,用于控制隐藏与显示. ...
- 剑指 Offer 46. 把数字翻译成字符串
题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...
- 2048游戏 - C语言不引入图形库简单实现
声明:本程序绝大部分属于原创,交互部分参考了博客园 Judge Young的原创文章 游戏2048源代码 - C语言控制台界面版, 作者Judge Young的算法思想非常值得参考,感谢作者的分享 附 ...