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 配置的加载的更多相关文章

  1. SpringBoot在启动时的多环境配置以及加载顺序

    通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...

  2. springboot idea 配置热加载

    在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...

  3. SpringBoot启动如何加载application.yml配置文件

    一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...

  4. SpringBoot配置文件的加载位置

    1.springboot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 --file:/config/ - ...

  5. SpringBoot是如何加载配置文件的?

    前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? Sp ...

  6. springboot 配置文件的加载顺序

    springboot 配置文件的加载顺序1.在命令行中传入的参数.2. SPRING APPLICATION JSON中的属性. SPRING_APPLICATION—JSON是以JSON格式配置在系 ...

  7. Crystal框架配置参数加载机制详解?

    前言 定义 配置参数定义的形式 配置参数文件定义在哪里? 配置参数加载的优先级 如何使用配置参数? 最佳实践 Jar项目中如何定义配置参数? War项目中如何定义或重载Jar包中的配置参数? 开发人员 ...

  8. igmpproxy源代码学习——配置信息加载 loadConfig

            在igmpproxy主程序运行之前需要先读取配置文件,igmpproxy的配置文件通常为/etc/igmpproxy.conf或者/var/igmpproxy.conf 其内容如下: ...

  9. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...

随机推荐

  1. python - 基础局部变量和全局变量

    python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问 首先我们来看下什么是全局变量和局部变量 全局变量:在函数之外定义的变量,所有函数内可以调用这个全局变量 ...

  2. SpringMVC修改视图定位

    @ 目录 什么是视图定位 修改springmvc-servlet.xml 修改IndexController 移动index.jsp 测试 什么是视图定位 如果代码写成这样,就表示跳转到页面 inde ...

  3. three.js 制作逻辑转体游戏(下)

    上一篇已经对绕非定轴转动有所了解,这篇郭先生继续说一说逻辑转体游戏的制作,这部分我们同样会遇到一些小问题,首先是根据数据渲染陷阱和目标区域,然后是对可以转动的判定,最后是获胜的判定. 1. 根据数据渲 ...

  4. Jmeter 常用函数(20)- 详解 __counter

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 计数器,跟配置元件里面的计数器作用类似哦 ...

  5. 第2章 Hive安装

    第2章 Hive安装 2.1 Hive安装地址 1.Hive官网地址 http://hive.apache.org/ 2.文档查看地址 https://cwiki.apache.org/conflue ...

  6. Clickhouse单机及集群部署详解

    一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内社区火热,各个大厂纷纷跟进大规模使用: 今日头条 内部用ClickHous ...

  7. 在win10的Linux子系统(WSL)上搭载python编程环境

    为什么使用WSL进行python编程 WSL,全称Windows Subsystem for Linux.简言之,win10提供了一个子Linux系统,可以解决虚拟机和双系统的系统之间阻隔的问题而不影 ...

  8. 易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码

    易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码        怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到易盛9.0行情API接口,本身易盛就是一个软件提供商,提供行 ...

  9. 分块练习C. interval

    分块练习C. interval 题目描述 \(N\)个数\(a_i\),\(m\)个操作 \(1\). 从第一个数开始,每隔\(k_i\)个的位置上的数增加\(x_i\) \(2\). 查询\(l\) ...

  10. 仓库ERP管理系统(springboot)

    查看更多系统:系统大全,课程设计.毕业设计,请点击这里查看 01 系统概述 基于SpringBoot框架和SaaS模式,非常好用的ERP软件,目前专注进销存+财务功能.主要模块有零售管理.采购管理.销 ...