SpringBoot 的配置文件內置支持 properties、xml、yml、yaml 幾種格式,其中 properties和xml 對應的Loader類為 PropertiesPropertySourceLoader ,yml和yaml 對應的Loader類為 YamlPropertySourceLoader。
觀察這2個類可以發現,都實現自接口 PropertySourceLoader 。所以我們要新增支持別的格式的配置文件,就可以通過實現接口 PropertySourceLoader 來實現了。
下面實現了一個 json 格式的配置文件 Loader類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package com.shanhy.sboot.property; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.springframework.boot.env.PropertySourceLoader; import org.springframework.boot.json.JsonParser; import org.springframework.boot.json.JsonParserFactory; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; /** * JSON格式配置文件加載器 * * @author 單紅宇(CSDN CATOOP) * @create 2017年4月20日 */ public class JsonPropertySourceLoader implements PropertySourceLoader { public String[] getFileExtensions() { // 配置文件格式(擴展名) return new String[] { "json" }; } public PropertySource<?> load(String name, Resource resource, String profile) throws IOException { // 處理機制參考PropertiesPropertySourceLoader // 無論profile有沒有值,底層都會嘗試先執行 load(String name, Resource resource, null),所以這個地方之間判斷等于null即可。 // 當前版本springboot-1.5.2(后續版本未知)詳見 ConfigFileApplicationListener 的 445 行 if (profile == null ) { Map<String, Object> result = mapPropertySource(resource); return new MapPropertySource(name, result); } return null ; } /** * 解析Resource為Map * * @param resource * @return * @throws IOException * * @author 單紅宇(CSDN CATOOP) * @create 2017年4月20日 */ private Map<String, Object> mapPropertySource(Resource resource) throws IOException { if (resource == null ) { return null ; } Map<String, Object> result = new HashMap<String, Object>(); JsonParser parser = JsonParserFactory.getJsonParser(); Map<String, Object> map = parser.parseMap(readFile(resource)); nestMap( "" , result, map); return result; } /** * 讀取Resource文件內容為字符串 * * @param resource * @return * @throws IOException * * @author 單紅宇(CSDN CATOOP) * @create 2017年4月20日 */ private String readFile(Resource resource) throws IOException { InputStream inputStream = resource.getInputStream(); List<Byte> byteList = new LinkedList<Byte>(); byte [] readByte = new byte [ 1024 ]; int length; while ((length = inputStream.read(readByte)) > 0 ) { for ( int i = 0 ; i < length; i++) { byteList.add(readByte[i]); } } byte [] allBytes = new byte [byteList.size()]; int index = 0 ; for (Byte soloByte : byteList) { allBytes[index] = soloByte; index += 1 ; } return new String(allBytes, "UTF-8" ); } /** * 處理map(map中可能還嵌套map,遞歸處理),最終輸出一個非嵌套的map * * @param prefix * 前綴 * @param result * 處理后的map * @param map * 處理前的map * * @author 單紅宇(CSDN CATOOP) * @create 2017年4月20日 */ @SuppressWarnings ( "unchecked" ) private void nestMap(String prefix, Map<String, Object> result, Map<String, Object> map) { if (prefix.length() > 0 ) { prefix += "." ; } for (Map.Entry<String, Object> entrySet : map.entrySet()) { if (entrySet.getValue() instanceof Map) { nestMap(prefix + entrySet.getKey(), result, (Map<String, Object>) entrySet.getValue()); } else { result.put(prefix + entrySet.getKey().toString(), entrySet.getValue()); } } } } |
然后在 src/main/resources 中創建 META-INF/spring.factories 文件,內容為:
1
2
|
org.springframework.boot.env.PropertySourceLoader=\ com.shanhy.sboot.property.JsonPropertySourceLoader |
創建測試的配置文件 application.json
1
2
3
4
5
6
7
|
{ "custom" : { "property" : { "message" : "測試數據" } } } |
創建驗證結果的 HelloController.Java
1
2
3
4
5
6
7
8
9
10
11
|
@RestController public class HelloController { @Value ( "${custom.property.message:}" ) private String customProperty; @RequestMapping ( "/test" ) public String test() { return customProperty; } } |
啟動工程服務,瀏覽器訪問 http://localhost:8080/test 即可查看輸出的結果為 “測試數據”;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/catoop/article/details/71157986