欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot如何配置嵌套map和list參數(shù)

 更新時間:2025年03月25日 09:18:48   作者:Jeremy_Lee123  
這篇文章主要介紹了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重大問題(坑)

    這篇文章主要介紹了SpringBoot發(fā)現(xiàn)最新版Druid重大問題(坑),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java 如何讀取遠(yuǎn)程主機文件

    java 如何讀取遠(yuǎn)程主機文件

    這篇文章主要介紹了java 如何讀取遠(yuǎn)程主機文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • IE8+SpringMVC文件上傳防止JSON下載

    IE8+SpringMVC文件上傳防止JSON下載

    這篇文章主要介紹了IE8+SpringMVC文件上傳防止JSON下載的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Spring IOC原理補充說明(循環(huán)依賴、Bean作用域等)

    Spring IOC原理補充說明(循環(huán)依賴、Bean作用域等)

    這篇文章主要介紹了Spring IOC原理補充說明(循環(huán)依賴、Bean作用域等),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JDBC核心技術(shù)詳解

    JDBC核心技術(shù)詳解

    這篇文章主要介紹了JDBC核心技術(shù)詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)JDBC的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • 使用dom4j解析xml文件問題

    使用dom4j解析xml文件問題

    這篇文章主要介紹了使用dom4j解析xml文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Springcloud服務(wù)注冊consul客戶端過程解析

    Springcloud服務(wù)注冊consul客戶端過程解析

    這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • ?java中Thread.sleep()的具體使用

    ?java中Thread.sleep()的具體使用

    本文主要介紹了?java中Thread.sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • JAVA中字符串函數(shù)subString的用法小結(jié)

    JAVA中字符串函數(shù)subString的用法小結(jié)

    本篇文章主要是對JAVA中字符串函數(shù)subString的用法進行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • Java雜談之代碼重構(gòu)的方法多長才算長

    Java雜談之代碼重構(gòu)的方法多長才算長

    關(guān)于代碼重構(gòu)的理解:在不改變軟件系統(tǒng)/模塊所具備的功能特性的前提下,遵循/利用某種規(guī)則,使其內(nèi)部結(jié)構(gòu)趨于完善。其在軟件生命周期中的價值體現(xiàn)主要在于可維護性和可擴展性
    2021-10-10

最新評論