spring项目读取配置的demo

配置加载器设计
本文介绍了一个配置加载器的设计实现,该加载器能够从多个配置文件中读取数据,并支持通过主配置文件引用其他配置文件。文章详细展示了如何使用Java进行配置文件的读取和解析,包括异常处理和正则表达式的应用。

背景

读取配置是基础能力,研发这个模式不错,可以从不同配置中读取数据,如下图:
411616-20190105115713584-54200896.png
可以根据不同分类的文件来管理配置,然后统一在conf中配置哪些文件

package com.jwen.platform.config;

import com.jwen.platform.exception.AppConfigurationException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

public enum Configurations {
    INSTANCE;

    private final static String KEY_VALUE_SEPARATOR = "=";
    private final static String CONFIGURATION_FILE = "application.conf";
    private final static String OTHER_CONFIGURATION_FILE_KEY = "app_include_file";

    private List<String> otherConfigurationFiles = new ArrayList<>();
    private Map<String, String> configurations = new HashMap<>();

    Configurations() {
        try {
            init();
        } catch (IOException | URISyntaxException e) {
            throw new AppConfigurationException("has error in your application.conf", e);
        }
    }

    private void init() throws IOException, URISyntaxException {

        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(CONFIGURATION_FILE);
        BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream));

        String s = "";
        List<String> lines = new ArrayList<String>();

        while ((s = br.readLine()) != null) {
            lines.add(s);
        }

        // 关闭流
        resourceAsStream.close();
        br.close();

        initConfigurations(lines);
        initOtherConfigurations();

    }

    private void initOtherConfigurations() throws URISyntaxException, IOException {
        for (String fileName : otherConfigurationFiles) {
            InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
            BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream));


            String s = "";
            List<String> lines = new ArrayList<String>();

            while ((s = br.readLine()) != null) {
                lines.add(s);
            }

            // 关闭流
            resourceAsStream.close();
            br.close();


            initConfigurations(lines);
        }

        otherConfigurationFiles = null;
    }

    private boolean isOtherConfigurationKey(String key) {
        return OTHER_CONFIGURATION_FILE_KEY.equalsIgnoreCase(key);
    }

    private void initConfigurations(List<String> lines) throws URISyntaxException, IOException {
        lines.stream().forEach(line -> {
            int keyValueSeparatorIndex = line.indexOf(KEY_VALUE_SEPARATOR);
            if (isLegalConfigurationLine(line)) {
                String key = line.substring(0, keyValueSeparatorIndex).trim();
                String value = line.substring(keyValueSeparatorIndex + 1, line.length()).trim();
                if (isOtherConfigurationKey(key)) {
                    otherConfigurationFiles.add(value);
                } else {
                    configurations.put(key, value);
                }
            }
        });
    }

    private boolean isLegalConfigurationLine(String line) {
        Pattern pattern = Pattern.compile("^[a-zA-Z](.*?)=(.*?)");
        return pattern.matcher(line).matches();
    }


    public String get(String key) {
        return configurations.get(key);
    }

    public static void main(String[] args) {

        System.out.println(Configurations.INSTANCE.get("test.on"));
    }
}

转载于:https://www.cnblogs.com/jwentest/p/10223928.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值