SpringBoot配置及环境变量的加载提供许多便利的方式,接下来一块儿来学习一下吧!java
本章内容的源码按实战过程采用小步提交,能够按提交的节点一步一步来学习,仓库地址:https://github.com/zhouweixin/spring-boot-configuration。git
环境:github
用你喜欢的方式建立一个SpringBoot工程,并写一个hello的接口,及相应的集成测试,进行实验吧!spring
HelloController.javashell
@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello world!"; } }
HelloControllerTest.javajson
@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!"))); } }
@Value经过直接注解在属性上为属性设置springboot
以下所示,为name设置值为tangsengapp
HelloController.javacurl
@Value("tangseng") private String name;
固然,上面的写法不涉及配置文件的读取,可是从配置文件加载数据也是一样简单spring-boot
以下所示,在${}中用json的方式设置配置文件中设置的key值
HelloController.java
@Value("${value.string}") private String valueString;
配置文件的内容为
application.properties
value.string=sunwukong
固然,@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;
写到这里,你确定认为@Value注解的功能就结束了
然而,并无,@Value还能够设置默认值
即,假如配置文件中没有配置该属性,也能够有默认值兜底的
默认值的设置格式以下所示
HelloController.java
@Value("${value.double:2.22}") private double valueDouble;
此次,你必定又一次认为@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;
接下来,写个接口及集成测试,测试一下结果
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}
@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方法必须有 }
@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; }
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"}}