SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list
讀取配置文件中的數(shù)據(jù)到map和list
之前使用過@Value("${name}")來讀取springboot配置文件中的配置信息,比如:
@Value("${server.port}")
private Integer port;后面遇到一個(gè)新問題,如果我要把配置文件中的一系列數(shù)據(jù)一下子讀出來到同一個(gè)數(shù)據(jù)結(jié)構(gòu)中怎么辦呢?
比如說讀取配置信息到map或者list
下面來講述一下如何實(shí)現(xiàn)這個(gè)功能。
springboot讀取配置文件中的配置信息到map
首先看配置文件要讀到map中的信息:
test: ? limitSizeMap: ? ? baidu: 1024 ? ? sogou: 90 ? ? hauwei: 4096 ? ? qq: 1024
接著我們需要再maven的pom.xml文件中添加如下依賴:
<dependency> ? <groupId>org.springframework.boot</groupId> ? <artifactId>spring-boot-configuration-processor</artifactId> ? <optional>true</optional> </dependency>
然后定義一個(gè)配置類,代碼如下:
package com.eknows.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* 配置類
* 從配置文件中讀取數(shù)據(jù)映射到map
* 注意:必須實(shí)現(xiàn)set方法
* @author eknows
* @version 1.0
* @since 2019/2/13 9:23
*/
Configuration
ConfigurationProperties(prefix = "test")
EnableConfigurationProperties(MapConfig.class)
public class MapConfig {
/**
* 從配置文件中讀取的limitSizeMap開頭的數(shù)據(jù)
* 注意:名稱必須與配置文件中保持一致
*/
private Map<String, Integer> limitSizeMap = new HashMap<>();
public Map<String, Integer> getLimitSizeMap() {
return limitSizeMap;
}
public void setLimitSizeMap(Map<String, Integer> limitSizeMap) {
this.limitSizeMap = limitSizeMap;
}
}
這樣,我們就可以把配置文件中的數(shù)據(jù)以map形式讀出來了,key就是配置信息最后一個(gè)后綴,value就是值。
測試代碼請看文章最后。
springboot讀取配置文件中的配置信息到list
首先看配置文件要讀到list中的信息:
test-list: ? limitSizeList[0]: "baidu: 1024" ? limitSizeList[1]: "sogou: 90" ? limitSizeList[2]: "hauwei: 4096" ? limitSizeList[3]: "qq: 1024"
接著如上添加spring-boot-configuration-processor依賴項(xiàng)。
然后定義配置類,代碼如下:
package com.eknows.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* 配置類
* 從配置文件中讀取數(shù)據(jù)映射到list
* @author eknows
* @version 1.0
* @since 2019/2/13 9:34
*/
Configuration
@ConfigurationProperties(prefix = "test-list") // 不同的配置類,其前綴不能相同
@EnableConfigurationProperties(ListConfig.class) // 必須標(biāo)明這個(gè)類是允許配置的
public class ListConfig {
private List<String> limitSizeList = new ArrayList<>();
public List<String> getLimitSizeList() {
return limitSizeList;
}
public void setLimitSizeList(List<String> limitSizeList) {
this.limitSizeList = limitSizeList;
}
}
測試上述配置是否有效
編寫測試類:
package com.eknows;
import com.eknows.config.ListConfig;
import com.eknows.config.MapConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
/**
* @author eknows
* @version 1.0
* @since 2019/2/13 9:28
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class ConfigTest {
@Autowired
private MapConfig mapConfig;
@Autowired
private ListConfig listConfig;
@Test
public void testMapConfig() {
Map<String, Integer> limitSizeMap = mapConfig.getLimitSizeMap();
if (limitSizeMap == null || limitSizeMap.size() <= 0) {
System.out.println("limitSizeMap讀取失敗");
} else {
System.out.println("limitSizeMap讀取成功,數(shù)據(jù)如下:");
for (String key : limitSizeMap.keySet()) {
System.out.println("key: " + key + ", value: " + limitSizeMap.get(key));
}
}
System.out.println("------");
List<String> limitSizeList = listConfig.getLimitSizeList();
if (limitSizeList == null || limitSizeList.size() <= 0) {
System.out.println("limitSizeList讀取失敗");
} else {
System.out.println("limitSizeList讀取成功,數(shù)據(jù)如下:");
for (String str : limitSizeList) {
System.out.println(str);
}
}
}
}
運(yùn)行測試類,發(fā)現(xiàn)控制臺(tái)輸出如下:
limitSizeMap讀取成功,數(shù)據(jù)如下:
key: qq, value: 1024
key: baidu, value: 1024
key: sogou, value: 90
key: hauwei, value: 4096
------
limitSizeList讀取成功,數(shù)據(jù)如下:
baidu: 1024
sogou: 90
hauwei: 4096
qq: 1024
配置文件的讀?。ò╨ist、map類型)
添加配置文件處理器的依賴,這樣在編寫配置文件的時(shí)候就會(huì)有提示了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>有了依賴,可以直接使用application.properties文件為我們工作了,這是Springboot的默認(rèn)文件,它會(huì)通過其機(jī)制讀取到上下文中,這樣就可以引用它了
讀取配置文件
在使用maven項(xiàng)目中,配置文件會(huì)放在resources根目錄下。
我們的springBoot是用Maven搭建的,所以springBoot的默認(rèn)配置文件和自定義的配置文件都放在此目錄。
springBoot的 默認(rèn)配置文件為 application.properties 或 application.yml,這里我們使用 application.properties。
首先在application.properties中添加我們要讀取的數(shù)據(jù)。
server.port = 8081 custom.name = lonewalker custom.age = 18
第一種方式
我們可以通過@Value注解,這是Spring就有的,使用${...}占位符來讀取配置在屬性文件中的內(nèi)容,既可以加在屬性也可以加在方法上
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
@Value("${custom.name}")
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
@Value("${custom.age}")
public void setAge(Integer age) {
this.age = age;
}
}我們在測試環(huán)境試一下:
@SpringBootTest
class DemoApplicationTests {
@Autowired
User user;
@Test
void contextLoads() {
System.out.println(user.getName());
System.out.println(user.getAge());
}
}第二種方式
如果有很多我們就要寫很多@Value,就會(huì)很麻煩,于是就有第二種方式
通過注解@ConfigurationProperties(prefix="配置文件中的key的前綴")可以將配置文件中的配置自動(dòng)與實(shí)體進(jìn)行映射,默認(rèn)從全局配置文件中獲取值。
@ConfigurationProperties("custom")這里的字符串database會(huì)和類中的屬性名稱組成全限定名去配置文件中查找
@Component
@ConfigurationProperties(prefix = "custom")
public class User {
private String name;
private Integer age;
getter()... setter()...
}擴(kuò)展
1、如何獲取list數(shù)據(jù)
test.list=aaa,bbb,ccc
又該如何讀取呢?
@SpringBootTest
class DemoApplicationTests {
@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
private List<String> testList;
@Test
void contextLoads() {
if (testList == null){
System.out.println("empty");
}else{
for (String list:testList
) {
System.out.println(list);
}
}
}
}首先這是一個(gè)EL表達(dá)式,${test.list:} 是為它加上默認(rèn)值,但是這樣有個(gè)問題,當(dāng)不配置該 key 值,默認(rèn)值會(huì)為空串,它的 length = 1,這樣解析出來 list 的元素個(gè)數(shù)就不是空了

所以在此之前先判斷一下是否為空,最終寫成這樣@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}") 就完美了,遍歷的結(jié)果

2、如何獲取map數(shù)據(jù)
test.map={name:"守約",force:"95"}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3源碼解讀effectScope API及實(shí)現(xiàn)原理
這篇文章主要為大家介紹了Vue3源碼解讀effectScope API及實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
解決springboot項(xiàng)目啟動(dòng)失敗Could not initialize class&
這篇文章主要介紹了解決springboot項(xiàng)目啟動(dòng)失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Spring中使用事務(wù)嵌套時(shí)需要警惕的問題分享
最近項(xiàng)目上有一個(gè)使用事務(wù)相對復(fù)雜的業(yè)務(wù)場景報(bào)錯(cuò)了。在絕大多數(shù)情況下,都是風(fēng)平浪靜,沒有問題。其實(shí)內(nèi)在暗流涌動(dòng),在有些異常情況下就會(huì)報(bào)錯(cuò),這種偶然性的問題很有可能就會(huì)在暴露到生產(chǎn)上造成事故,那究竟是怎么回事呢?本文就來簡單講講2023-04-04
深入了解Spring中最常用的11個(gè)擴(kuò)展點(diǎn)
我們一說到spring,可能第一個(gè)想到的是?IOC(控制反轉(zhuǎn))?和?AOP(面向切面編程)。除此之外,我們在使用spring的過程中,有沒有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。今天就來跟大家一起聊聊,在Spring中最常用的11個(gè)擴(kuò)展點(diǎn)2022-09-09

