將字典資料,配置在 yml 檔案中,透過載入yml將資料載入到 Map中
Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置檔案目錄(如:resources)下新建application-xxx
必須以application開頭的yml檔案, 多個檔案用 "," 號分隔,不能換行
專案結構檔案
application.yml
server:
port: 8088
application:
name: VipSoft Env Demo
spring:
profiles:
include:
dic # 在配置檔案目錄(如:resources)下新建application-xxx 開頭的yml檔案, 多個檔案用 "," 號分隔,不能換行
#性別字典
user-gender:
0: 未知
1: 男
2: 女
application-dic.yml
將字典獨立到單獨的yml檔案中
#支付方式
pay-type:
1: 微信支付
2: 貨到付款
在 resources
目錄下,建立META-INF
目錄,建立 spring.factories
檔案,
Spring Factories是一種類似於Java SPI的機制,它在META-INF/spring.factories檔案中配置介面的實現類名稱,然後在程式中讀取這些配置檔案並例項化。
內容如下:
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=com.vipsoft.web.utils.ConfigUtil
ConfigUtil
package com.vipsoft.web.utils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.properties.bind.BindResult;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.util.Assert;
public class ConfigUtil implements EnvironmentPostProcessor {
private static Binder binder;
private static ConfigurableEnvironment environment;
public static String getString(String key) {
Assert.notNull(environment, "environment 還未初始化!");
return environment.getProperty(key, String.class, "");
}
public static <T> T bindProperties(String prefix, Class<T> clazz) {
Assert.notNull(prefix, "prefix 不能為空");
Assert.notNull(clazz, "class 不能為空");
BindResult<T> result = ConfigUtil.binder.bind(prefix, clazz);
return result.isBound() ? result.get() : null;
}
/**
* 透過 META-INF/spring.factories,觸發該方法的執行,進行環境變數的載入
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
for (PropertySource<?> propertySource : environment.getPropertySources()) {
if (propertySource.getName().equals("refreshArgs")) {
return;
}
}
ConfigUtil.environment = environment;
ConfigUtil.binder = Binder.get(environment);
}
}
DictVo
package com.vipsoft.web.vo;
public class DictVO implements java.io.Serializable {
private static final long serialVersionUID = 379963436836338904L;
/**
* 字典型別
*/
private String type;
/**
* 字典編碼
*/
private String code;
/**
* 字典值
*/
private String value;
public DictVO(String code, String value) {
this.code = code;
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
DefaultController
package com.vipsoft.web.controller;
import com.vipsoft.web.utils.ConfigUtil;
import com.vipsoft.web.vo.DictVO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@RestController
public class DefaultController {
@GetMapping(value = "/")
public String login() {
return "VipSoft Demo !!!";
}
@GetMapping("/list/{type}")
public List<DictVO> listDic(@PathVariable("type") String type) {
LinkedHashMap dict = ConfigUtil.bindProperties(type.replaceAll("_", "-"), LinkedHashMap.class);
List<DictVO> list = new ArrayList<>();
if (dict == null || dict.isEmpty()) {
return list;
}
dict.forEach((key, value) -> list.add(new DictVO(key.toString(), value.toString())));
return list;
}
}
執行效果
單元測試
package com.vipsoft.web;
import com.vipsoft.web.controller.DefaultController;
import com.vipsoft.web.utils.ConfigUtil;
import com.vipsoft.web.vo.DictVO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class DicTest {
@Autowired
DefaultController defaultController;
@Test
public void DicListTest() throws Exception {
List<DictVO> pay_type = defaultController.listDic("pay-type");
pay_type.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));
List<DictVO> user_gender = defaultController.listDic("user-gender");
user_gender.forEach(p -> System.out.println(p.getCode() + " => " + p.getValue()));
}
@Test
public void getString() throws Exception {
String includeYml = ConfigUtil.getString("spring.profiles.include");
System.out.println("application 引用了配置檔案 =》 " + includeYml);
}
}