springboot如何配置嵌套map和list參數(shù)
.properties文件中存放一組配置參數(shù),分別為map類型和list類型,包含各種嵌套的map<String,List<String>>,List<Map<String,String>>,map<String,List<Pojo>>,List<Map<String,Pojo>>等復(fù)雜類型,做測試方式,讀取配置參數(shù)。
一、初級版--Map<String,String>和List<String>
1.1、配置文件application.properties添加如下參數(shù)
#map 第一種方式 data.mapConfig.key01=java data.mapConfig.key02=hadoop data.mapConfig.key03=flink #map 第二種方式(推薦) data.mapConfig[key01]=java data.mapConfig[key02]=hadoop data.mapConfig[key03]=flink #list 第一種方式 data.listConfig[0]=apple0 data.listConfig[1]=apple1 data.listConfig[2]=apple2 #list 第二種方式(推薦) data.listConfig=apple0,apple1,apple2
1.2、編寫MapListConfig類,用來讀取配置信息
package com.lxk.alarm.unified; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Configuration @ConfigurationProperties(prefix = "data") //如果只有一個主配置類文件,@PropertySource可以不寫 @PropertySource("classpath:application.properties") public class MapListConfig { /** * data.mapConfig * 這里map名需要和application.properties中的參數(shù)一致 */ private Map<String, String> mapConfig = new HashMap<>(); /** * data.listConfig * 這里list名需要和application.properties中的參數(shù)一致 */ private List<String> listConfig = new ArrayList<>(); /** * 編寫get,set方法方便使用 */ public Map<String, String> getMapConfig() { return mapConfig; } public void setMapConfig(Map<String, String> mapConfig) { this.mapConfig = mapConfig; } public List<String> getListConfig() { return listConfig; } public void setListConfig(List<String> listConfig) { this.listConfig = listConfig; } }
1.3、測試類測試
package com.lxk.alarm.unified; @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootTest { @Autowired private MapListConfig mapListConfig; @Test public void mapListTest() { Map<String, String> map = mapListConfig.getMapConfig(); List<String> list = mapListConfig.getListConfig(); System.out.println("Map<String, String>: "+JSON.toJSONString(map)); System.out.println("List<String>: "+ JSON.toJSONString(list)); } }
//輸出結(jié)果
Map<String, String>: {"key03":"flink","key02":"hadoop","key01":"java"}
List<String>: ["apple0","apple1","apple2"]
補充另一種自動注入:
@Value("#{'${data.listConfig}'.split(',')}") private List<String> list;
二、中級版--map<String,List<String>>和List<Map<String,String>>
2.1、配置文件application.properties添加如下參數(shù)
#map-- map<String,List<String>> data01.mapList.key01[0]=java data01.mapList.key01[1]=hadoop data01.mapList.key01[2]=flink data01.mapList.key02[0]=pyhthon data01.mapList.key02[1]=c++ data01.mapList.key02[2]=scala #list -- List<Map<String,String>> data01.listMap[0].key01=apple0 data01.listMap[0].key02=apple1 data01.listMap[1].key01=apple3 data01.listMap[1].value02=apple4
2.2、編寫MapListConfig02類,用來讀取配置信息
package com.lxk.alarm.unified; @Configuration @ConfigurationProperties(prefix = "data01") //如果只有一個主配置類文件,@PropertySource可以不寫 @PropertySource("classpath:application.properties") public class MapListConfig02 { /** * data.mapConfig * 這里map名需要和application.properties中的參數(shù)一致 */ private Map<String,List<String>> mapList = new HashMap<>(); /** * data.listConfig * 這里list名需要和application.properties中的參數(shù)一致 */ private List<Map<String,String>> listMap = new ArrayList<>(); /** * 編寫get,set方法方便使用 */ public Map<String, List<String>> getMapList() { return mapList; } public void setMapList(Map<String, List<String>> mapList) { this.mapList = mapList; } public List<Map<String, String>> getListMap() { return listMap; } public void setListMap(List<Map<String, String>> listMap) { this.listMap = listMap; } }
2.3、測試類測試
@RunWith(SpringRunner.class) @SpringBootTest public class SpringbootTest { @Autowired private MapListConfig mapListConfig; @Autowired private MapListConfig02 mapListConfig02; @Test public void mapListTest02() { Map<String, List<String>> mapList = mapListConfig02.getMapList(); List<Map<String, String>> listMap = mapListConfig02.getListMap(); System.out.println("Map<String, List<String>>: "+JSON.toJSONString(mapList)); System.out.println("List<Map<String, String>>: "+ JSON.toJSONString(listMap)); } }
//輸出結(jié)果
Map<String, List<String>>: {"key02":["pyhthon","c++","scala"],"key01":["java","hadoop","flink"]}
List<Map<String, String>>: [{"key01":"apple0","key02":"apple1"},{"key01":"apple3","value02":"apple4"}]
三、高級版--Map<String,List<Pojo>>和List<Map<String,Pojo>>
3.1、配置文件application.properties添加如下參數(shù)
#第三種 #map-- map<String,List<POJO>> data02.mapList.key01[0].name=zhangsan data02.mapList.key01[0].sex=male data02.mapList.key01[0].age=30 data02.mapList.key01[1].name=lisi data02.mapList.key01[1].sex=female data02.mapList.key01[1].age=33 data02.mapList.key02[0].name=wangwu data02.mapList.key02[0].sex=male data02.mapList.key02[0].age=35 #list -- List<Map<String,POJO>> data02.listMap[0].key01[name]=zhangsan data02.listMap[0].key01[sex]=male data02.listMap[0].key01[age]=17 data02.listMap[1].key01[name]=lisi data02.listMap[1].key01[sex]=female data02.listMap[1].key01[age]=18
3.2、編寫MapListConfig03類,用來讀取配置信息
package com.lxk.alarm.unified; @Configuration @ConfigurationProperties(prefix = "data02") //如果只有一個主配置類文件,@PropertySource可以不寫 @PropertySource("classpath:application.properties") public class MapListConfig03 { /** * data.mapConfig * 這里map名需要和application.properties中的參數(shù)一致 */ private Map<String,List<Person>> mapList = new HashMap<>(); /** * data.listConfig * 這里list名需要和application.properties中的參數(shù)一致 */ private List<Map<String,Person>> listMap = new ArrayList<>(); /** * 編寫get,set方法方便使用 */ public Map<String, List<Person>> getMapList() { return mapList; } public void setMapList(Map<String, List<Person>> mapList) { this.mapList = mapList; } public List<Map<String, Person>> getListMap() { return listMap; } public void setListMap(List<Map<String, Person>> listMap) { this.listMap = listMap; } }
3.3、測試類測試
@RunWith(SpringRunner.class) @SpringBootTest public class SpringbootTest { @Autowired private MapListConfig mapListConfig; @Autowired private MapListConfig02 mapListConfig02; @Autowired private MapListConfig03 mapListConfig03; @Autowired private Environment env; @Test public void mapListTest03() { Map<String, List<Person>> mapList = mapListConfig03.getMapList(); List<Map<String, Person>> listMap = mapListConfig03.getListMap(); System.out.println("Map<String, List<Person>>: "+JSON.toJSONString(mapList)); System.out.println("List<Map<String, Person>: "+ JSON.toJSONString(listMap)); } }
//輸出結(jié)果
Map<String, List<Person>>: {"key02":[{"age":35,"name":"wangwu","sex":"male"}],"key01":[{"age":30,"name":"zhangsan","sex":"male"},{"age":33,"name":"lisi","sex":"female"}]}
List<Map<String, Person>: [{"key01":{"age":17,"name":"zhangsan","sex":"male"}},{"key01":{"age":18,"name":"lisi","sex":"female"}}]
3.4、FAQ: Field required a single bean, but 2 were found
解決:添加@Primary告訴spring初始化時使用哪個主要的實現(xiàn)類。
(1)@Autowired
@Autowired為Spring提供的注解,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照類型(byType)裝配依賴對象,默認(rèn)情況下它要求依賴對象必須存在,如果允許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用。如下:
(2)@Resource
@Resource默認(rèn)按照ByName自動注入,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。
四、四種方式獲取配置
4.1、@ConfigurationProperties方式 +(prefix = "data")
適用于Map和List配置,需要加前綴‘prefix
’
4.2、使用@Value注解方式
適用于單個key=value
4.3、使用自帶Environment
適用于單個key=value
import org.springframework.core.env.Environment; @Autowired private Environment env; ... map.put("type", env.getProperty("data.listConfig")); map.put("title", new String(env.getProperty("data.listConfig").getBytes("ISO-8859-1"), "UTF-8")); // 解決中文亂碼
4.4、使用自帶Environment
- 方式一:Properties properties = PropertiesLoaderUtils.loadAllProperties("sql.properties");
- 方式二:由于配置文件一般同時全局的,能夠經(jīng)過PropertiesListener的監(jiān)聽經(jīng)行啟動的時候就獲取到。能夠避免每調(diào)用一次方法就加載一次
1.編寫一個配置文件監(jiān)聽的類PropertiesListener
每當(dāng)ApplicationContext發(fā)布ApplicationEvent時,ApplicationListener Bean將自動被觸發(fā)java
public class PropertiesListener implements ApplicationListener<ApplicationStartedEvent> { private String propertyFileName; public PropertiesListener(String propertyFileName) { this.propertyFileName = propertyFileName; } @Override public void onApplicationEvent(ApplicationStartedEvent event) { PropertiesListenerConfig.loadAllProperties(propertyFileName); } }
2.在編寫一個配置文件的加載類PropertiesListenerConfigweb
public class PropertiesListenerConfig { public static Map<String, String> propertiesMap = new HashMap<>(); private static void processProperties(Properties props) throws BeansException { propertiesMap = new HashMap<String, String>(); for (Object key : props.keySet()) { String keyStr = key.toString(); try { // PropertiesLoaderUtils的默認(rèn)編碼是ISO-8859-1,在這里轉(zhuǎn)碼一下 propertiesMap.put(keyStr, new String(props.getProperty(keyStr).getBytes("ISO-8859-1"), "utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (java.lang.Exception e) { e.printStackTrace(); } } } public static void loadAllProperties(String propertyFileName) { try { Properties properties = PropertiesLoaderUtils.loadAllProperties(propertyFileName); processProperties(properties); } catch (IOException e) { e.printStackTrace(); } } public static String getProperty(String name) { return propertiesMap.get(name).toString(); } public static Map<String, String> getAllProperty() { return propertiesMap; } }
3.在springboot的啟動類上面添加監(jiān)聽spring
public static ApplicationContext applicationContext; public static void main(String[] args) { SpringApplication application = new SpringApplication(WebApp.class); // 第四種方式:注冊監(jiān)聽器 application.addListeners(new PropertiesListener("sql.properties")); applicationContext = application.run(args); } }
4.在方法上調(diào)用經(jīng)過PropertiesListenerConfig.getAllProperty();調(diào)用sql
Map<String, String> allProperty = PropertiesListenerConfig.getAllProperty();
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot發(fā)現(xiàn)最新版Druid重大問題(坑)
這篇文章主要介紹了SpringBoot發(fā)現(xiàn)最新版Druid重大問題(坑),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring IOC原理補充說明(循環(huán)依賴、Bean作用域等)
這篇文章主要介紹了Spring IOC原理補充說明(循環(huán)依賴、Bean作用域等),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08JAVA中字符串函數(shù)subString的用法小結(jié)
本篇文章主要是對JAVA中字符串函數(shù)subString的用法進行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02