SpringBoot 配置的加載

SpringBoot 配置的加載

SpringBoot配置及環境變量的加載提供許多便利的方式,接下來一塊兒來學習一下吧!java

本章內容的源碼按實戰過程採用小步提交,能夠按提交的節點一步一步來學習,倉庫地址:https://github.com/zhouweixin/spring-boot-configuration。git

環境:github

  • java: 1.8.0_265
  • gradle: 6.6.1

1 準備

用你喜歡的方式建立一個SpringBoot工程,並寫一個hello的接口,及相應的集成測試,進行實驗吧!spring

1.1 hello接口代碼

HelloController.javashell

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello world!";
    }
}

1.2 hello集成測試代碼

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!")));
    }
}

2 註解@Value

2.1 介紹

@Value經過直接註解在屬性上爲屬性設置springboot

以下所示,爲name設置值爲tangsengapp

HelloController.javacurl

@Value("tangseng")
private String name;

2.2 加載配置文件

固然,上面的寫法不涉及配置文件的讀取,可是從配置文件加載數據也是一樣簡單spring-boot

以下所示,在${}中用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"}}
相關文章
相關標籤/搜索