spring boot讀取yml配置文件的幾種方式


實際項目中一般使用application.yml作為配置文件,下面介紹yml的規范和如何讀取yml。

yml文件書寫規范:

1、通過縮進(推薦兩個空格)區分層次(不能使用tab縮進,否則會報錯),較properties更具可讀性

2、屬性名命名可以使用駝峰命名法,也可以使用-或者_,比如用戶名可以是userName,user-name,USER_NAME,意思都是一樣的

3、鍵值對的書寫形式,key跟着冒號,然后空格(不能少),然后是value

各類數據書寫形式:

1、數字,字符串,布爾等

# key: value形式
name: zs
age: 20
enable: true

2、數組,集合(List,Set)

# 方式一:換行縮進,使用-表示一個元素(常用)
# 如Java bean中的List<String> tels 或者 String[] tels
tels: 
  - 110
  - 120
# List<Users> users
users: 
  - name: zs
    age: 20
  - name: ls
    age: 30
# 方式二:單行配置
tels: 110, 120
users: {name: zs, age: 20}, {name: ls, age: 30}

3、Map和對象

# 方式一:多行配置
# 如Map<String, Integer> score或者Score score
score:
  chinese: 95
  english: 90
# 方式二:單行配置
score: {chinese: 95, english: 90}

讀取yml文件:

先在application.yml中寫好相關配置:

user:
  user-name: Mr.Zhang
  age: 38
  tels:
    - 110
    - 120
  score:
    chinese: 95
    english: 90
  users:
    - user-name: zs
      age: 5
    - user-name: ls
      age: 12

一、@Value注解(值綁定)

定義一個JavaBean,提供get和set方法(必須),用於接收從yml讀取的數據

@Data
@Component
public class Users {

    /**
     * @Value 值綁定
     * 在每個對應的屬性上加@Value注解,注解中的內容填寫yml中對應的屬性,
     * 使用@Value注解時,yml中的屬性名和JavaBean中的屬性名可以不對應,但是數據類型需要對應
     */
    @Value("${user.userName}")
    private String name;
    @Value("${user.age}")
    private Integer age;
    @Value("${user.tesl}")
    private String[] tels;
    @Value("${user.score}")
    private Map<String, Integer> score;
    @Value("${user.users}")
    private List<Users> children;
    
}

二、@ConfigurationProperties注解(松散綁定)

定義一個JavaBean,提供get和set方法,用於接收從yml讀取的數據

/**
 * ConfigurationProperties 松散綁定,只需要通過prefix屬性指定屬性參數名的前綴即可
 * 松散綁定的bean屬性名需要跟yml中的屬性名對應,但是不需要精確匹配,
 * yml可依據約定使用駝峰(如:userName)、"-"線(如:user-name)、全大寫加上"_"(如:USER_NAME)
 */
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class Users {

    private String userName;
    private Integer age;
    private String[] tels;
    private Map<String, Integer> score;
    private List<Teacher> oldTeachers;
    private List<Teacher> newTeachers;

}

單元測試:

// 在單元測試中注入這個bean
@Autowired
private Users user;

@Test
void testUsers(){
    System.out.println(user.getName());
    System.out.println(user.getAge());
}

結果:

Mr.Zhang
38

三、YamlMapFactoryBean

通過這個factoryBean可以直接返回一個Map,而不需要使用JavaBean去接收yml讀取的值

public static void main(String[] arg0){
    YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean();
    //可以加載多個yml文件
    yamlMapFactoryBean.setResources(new ClassPathResource("application.yml"));
    //通過getObject()方法獲取Map對象
    Map<String, Object> map = yamlMapFactoryBean.getObject();
    System.out.println(map);
    map.keySet().forEach(item -> {
        //可以將map中的值強轉為LinkedHashMap對象
        LinkedHashMap<String, Object> linkedHashMap = (LinkedHashMap<String, Object>) (map.get(item));
        System.out.println(linkedHashMap.get("tels"));
    });
}

輸出:

{user={user-name=zhangsan, age=18, tels=[13479990123, 13567890987, null], score={chinese=95, english=90}, users=[{name=Mr.Zhang, age=29}, {name=Mr.Li, age=39}]}}
[13479990123, 13567890987]

四、YamlPropertiesFactoryBean

通過這個類可以直接返回Properties對象

public static void main(String[] arg0){
    YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
    factoryBean.setResources(new ClassPathResource("application.yml"));
    Properties properties = factoryBean.getObject();
    properties.keySet().forEach(key -> System.out.println(key + "=====" + properties.get(key)));
}

輸出:

user.age=====18
user.users[0].age=====5
user.users[0].user-name=====zs
user.users[1].age=====15
user.users[1].user-name=====ls
user.score.chinese=====95
user.score.english=====90
user.tels[0]=====13479990123
user.tels[1]=====13567890987
user.user-name=====zhangsan

注意:如果讀取yml時產生報錯,顯示的是yml文件有問題,那么很可能是因為yml文件中存在的中文造成的,那么只需要修改項目和這個文件的編碼即可,首先要先將文件中的內容全部復制(如果把內容刪了之后yml文件的編碼修改了可能會導致撤回不了,所以要復制),然后File -> Settings -> Editor -> File Encodings打開對應控制面板,將里面所有的編碼都改成UTF-8即可。

 


免責聲明!

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



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