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"}}