java解析yml配置信息

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 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配置信息)