java解析yml配置信息
2021-09-07 本文已影响0人
谁把月亮涂黑啦
snakeyaml包做解析
有时候需要在静态代码块中加载配置文件(比如存到静态变量当中,项目启动时读取),这时value注解会失效,需要自己解析文件,试试snakeyaml包吧,先在pom.xml中引入依赖
@Component
public class Config {
static {
// 文件名前面不能加斜杆
// 也可以使用 Loader.class.getClassLoader().getResourceAsStream
InputStream in = Config.class.getClassLoader().getResourceAsStream("application-dev.yml");
assert in != null;
// 防止出现中文乱码
// BufferedReader bf = new BufferedReader(new InputStreamReader(in));
Yaml yaml = new Yaml();
LinkedHashMap<String, Object> obj = yaml.load(in);
JSONObject myPropertyConfig = JSONObject.parseObject(JSONObject.toJSONString(obj.get("pay")));
System.out.println(myPropertyConfig.getJSONObject("alipay"));
// 使用配置信息...
}
}
Properties 类也可以加载yml,但是打印结果出来的是展平的结构,嵌套的属性解析失效了,类似于下面的多级结构就无法解析,返回的是null
image.png
value注解
public class Test {
@Value("${pay.alipay.appId}")
private String appId;
}
这种常见的形式可以在当前类使用,共享的话需要提出来在单独的bean中解析,autowired 引用即可。
或者想做缓存的话,可以赋给静态变量,项目启动时开始读取。
public class InitAlipayBaseConfig implements ApplicationRunner {
private static final CertAlipayRequest ALIPAY_BASE_CONFIG = new CertAlipayRequest();
@Value("${pay.alipay.appId}")
private String appId;
@Override
public void run(ApplicationArguments args) {
System.out.println("正在初始化 ......");
ALIPAY_BASE_CONFIG.setAppId(appId);
}
public static CertAlipayRequest getAlipayBaseConfig() {
return ALIPAY_BASE_CONFIG;
}
}
这个 run 方法会在容器初始化完毕后自动执行