美文网首页
java解析yml配置信息

java解析yml配置信息

作者: 谁把月亮涂黑啦 | 来源:发表于2021-09-07 18:14 被阅读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 方法会在容器初始化完毕后自动执行

    相关文章

      网友评论

          本文标题:java解析yml配置信息

          本文链接:https://www.haomeiwen.com/subject/nvjpwltx.html