SpringBoot用@ConfigurationProperties獲取各類配置文件


測試代碼

MyConfigurationProperties

項目為SpringBoot項目,在Postman中調/showValue即可看到結果。本文中例子都是基於properties文件。

package com.example.configuration;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Set;

@ConfigurationProperties(prefix = "com.demo")
@Component
public class MyConfigurationProperties {

    public String myString;
    public int myInt;
    public boolean myBoolean;
    public char myChar;

    public List<String> myList;
    public Set<String> mySet;
    public Map<String, String> myMap;

    public Student student;

    public List<Student> myStudentList;
    public Set<Student> myStudentSet;
    public Map<String, Student> myStudentMap;
    
    // getter setter 省略

}

IndexController:測試類

package com.example.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    @Autowired
    public MyConfigurationProperties myConfigurationProperties;

    @RequestMapping("/showValue")
    public MyConfigurationProperties showValue() {
        return myConfigurationProperties;
    }
}

Student:一個簡單實體類

package com.example.configuration;

public class Student {

    public String name;
    public int age;
    public Boolean boy;

    // getter setter 省略
    
}

測試結果

測試結果與下文對應

{
    "myString": "Hello World",
    "myInt": 2020,
    "myBoolean": true,
    "myChar": "t",
    "myList": [
        "list5",
        "list4",
        "list3",
        "list2",
        "list1",
        "list1"
    ],
    "mySet": [
        "set1",
        "set2",
        "set3",
        "set4",
        "set5"
    ],
    "myMap": {
        "k1": "v1",
        "k2": "v2",
        "k3": "v3"
    },
    "student": {
        "name": "Han Meimei",
        "age": 18,
        "boy": false
    },
    "myStudentList": [
        {
            "name": "LiLei",
            "age": 20,
            "boy": true
        },
        {
            "name": "Han Meimei",
            "age": 18,
            "boy": false
        }
    ],
    "myStudentSet": [
        {
            "name": "LiLei",
            "age": 20,
            "boy": true
        },
        {
            "name": "LiLei",
            "age": 20,
            "boy": true
        },
        {
            "name": "Han Meimei",
            "age": 20,
            "boy": false
        }
    ],
    "myStudentMap": {
        "boy": {
            "name": "LiLei",
            "age": 20,
            "boy": true
        },
        "girl": {
            "name": "Han Meimei",
            "age": 18,
            "boy": false
        }
    }
}

基本類型

com.demo.my-string=Hello World
com.demo.my-int=2020
com.demo.my-boolean=true
com.demo.my-char=t

String的List,Set,Map

com.demo.my-list=list5,list4,list3,list2,list1,list1
com.demo.my-set=set1,set2,set3,set4,set5,set5
com.demo.my-map.k1=v1
com.demo.my-map.k2=v2
com.demo.my-map.k3=v3

這里我看網上好多寫法都是下面這樣,個人觀點除非value中有逗號否則真的沒有必要

com.demo.my-list[0]=list0
com.demo.my-list[1]=list1
com.demo.my-set[0]=set0
com.demo.my-set[1]=set1

注意:Set中如果有重復的值,只會保存一次,上面兩種用法都是

一般實體類

com.demo.student.name=Han Meimei
com.demo.student.age=18
com.demo.student.boy=false

實體類的List,Set,Map

com.demo.my-student-list[0].name=LiLei
com.demo.my-student-list[0].age=20
com.demo.my-student-list[0].boy=true
com.demo.my-student-list[1].name=Han Meimei
com.demo.my-student-list[1].age=18
com.demo.my-student-list[1].boy=false

com.demo.my-student-set[0].name=LiLei
com.demo.my-student-set[0].age=20
com.demo.my-student-set[0].boy=true
com.demo.my-student-set[1].name=LiLei
com.demo.my-student-set[1].age=20
com.demo.my-student-set[1].boy=true
com.demo.my-student-set[2].name=Han Meimei
com.demo.my-student-set[2].age=20
com.demo.my-student-set[2].boy=false

com.demo.my-student-map.boy.name=LiLei
com.demo.my-student-map.boy.age=20
com.demo.my-student-map.boy.boy=true
com.demo.my-student-map.girl.name=Han Meimei
com.demo.my-student-map.girl.age=18
com.demo.my-student-map.girl.boy=false

注意:這里面set[0]set[1]的實體類屬性都是一樣的, 但在上面的測試結果中,李雷還是返回了2次,這和String的Set是不一樣的

總結

其實也沒有什么好總結的,com.demo是前綴,那么前綴之后緊接的一級key就是Java類中的變量名,再在代碼中看這個變量的類型或者看之前的人怎么用的,很快就能知道用法了。

附:完整的properties文件

com.demo.my-string=Hello World
com.demo.my-int=2020
com.demo.my-boolean=true
com.demo.my-char=t

com.demo.my-list=list5,list4,list3,list2,list1,list1
com.demo.my-set=set1,set2,set3,set4,set5,set5
com.demo.my-map.k1=v1
com.demo.my-map.k2=v2
com.demo.my-map.k3=v3

com.demo.student.name=Han Meimei
com.demo.student.age=18
com.demo.student.boy=false

com.demo.my-student-list[0].name=LiLei
com.demo.my-student-list[0].age=20
com.demo.my-student-list[0].boy=true
com.demo.my-student-list[1].name=Han Meimei
com.demo.my-student-list[1].age=18
com.demo.my-student-list[1].boy=false

com.demo.my-student-set[0].name=LiLei
com.demo.my-student-set[0].age=20
com.demo.my-student-set[0].boy=true
com.demo.my-student-set[1].name=LiLei
com.demo.my-student-set[1].age=20
com.demo.my-student-set[1].boy=true
com.demo.my-student-set[2].name=Han Meimei
com.demo.my-student-set[2].age=20
com.demo.my-student-set[2].boy=false

com.demo.my-student-map.boy.name=LiLei
com.demo.my-student-map.boy.age=20
com.demo.my-student-map.boy.boy=true
com.demo.my-student-map.girl.name=Han Meimei
com.demo.my-student-map.girl.age=18
com.demo.my-student-map.girl.boy=false

附:完整的yaml文件

com:
  demo:
    my-boolean: true
    my-char: t
    my-int: 2020
    my-list: list5,list4,list3,list2,list1,list1
    my-map:
      k1: v1
      k2: v2
      k3: v3
    my-set: set1,set2,set3,set4,set5,set5
    my-string: Hello World
    my-student-list:
    - age: 20
      boy: true
      name: LiLei
    - age: 18
      boy: false
      name: Han Meimei
    my-student-map:
      boy:
        age: 20
        boy: true
        name: LiLei
      girl:
        age: 18
        boy: false
        name: Han Meimei
    my-student-set:
    - age: 20
      boy: true
      name: LiLei
    - age: 20
      boy: true
      name: LiLei
    - age: 20
      boy: false
      name: Han Meimei
    student:
      age: 18
      boy: false
      name: Han Meimei

還是覺得properties文件比較好懂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM