實際項目中一般使用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即可。