zoukankan      html  css  js  c++  java
  • 从内外配置文件中读取配置信息

    在项目中总会留一些配置项让用户根据需求修改,这时候就需要一个外部配置文件,同时我们可以在项目中放置一个默认配置文件。主要是通过继承spring提供的PropertyPlaceholderConfigurer这个类来实现的。具体的加载过程请参考如下代码

    @Component
    @Conditional(XXXCondition.class)  //根据条件选择是否加载这个component
    public class EmbeddedPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    private String outterProp;
    String innerProp="xxxx.properties";
    Properties configProps;
    
    @Override
    protected void loadProperties(Properties props) throws IOException {
    if (configProps == null) {
    init();
    }
    props.putAll(configProps);
    }
    
    
    private void init() {
    InputStream innerStream=this.getClass().getClassLoader().getResourceAsStream(innerProp);
    String content = readContent(innerStream);
    addContent(content);
    
    outterProp=System.getenv("resource_path");
    if(outterProp==null){
    logger.error("The path to the properties file, "resource_path", is not specified");
    return;
    }
    Path outterPath = Paths.get(outterProp);
    try (InputStream outterStream= Files.newInputStream(outterPath)){
    content = readContent(outterStream);
    addContent(content);
    } catch (IOException e) {
    logger.error(e.getMessage());
    }
    }
    
    private void addContent(String content){
    
    if (content == null || content.length() <= 0) {
    return;
    }
    
    String[] ss = content.split("
    ");
    for(String s : ss) {
    if (s == null || s.length() <= 0) {
    continue;
    }
    String[] split = s.split("=",2);
    String key = split[0];
    if (key != null) {
    key = key.trim();
    }
    
    if (key == null || key.length() <= 0 || key.charAt(0) == '#') {
    continue;
    }
    
    String value = split[1];
    if (value != null) {
    value = value.trim();
    }
    
    if (this.configProps == null) {
    this.configProps = new Properties();
    }
    
    this.configProps.put(key, value);
    }
    }
    
    public static String readContent(InputStream inputStream) {
    
    String encoding = "UTF-8";
    StringBuffer buffer = new StringBuffer("");
    try {
    InputStreamReader read = new InputStreamReader(inputStream, encoding);
    BufferedReader bufferedReader = new BufferedReader(read);
    String lineTxt = null;
    while ((lineTxt = bufferedReader.readLine()) != null) {
    buffer.append(lineTxt).append("
    ");
    }
    read.close();
    
    } catch (Throwable t) {
    logger.error("error when read content", t);
    }
    
    return buffer.toString();
    }
    
    
    /**
    * 可以继承spring提供的Condition接口,根据自定义条件来判断是否加载当前的component
    * 例如本例中当环境变量embedded存在且为true的时候才会加载
    */
    public class XXXCondition implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            return (conditionContext.getEnvironment().getProperty("embedded")!=null&&conditionContext.getEnvironment().getProperty("embedded").contains("true"));
        }
    }
  • 相关阅读:
    如下架构的调整就是一种“移动算力”的情形
    越是松散和动态的,越要进行适当和合理的控制,不然会造成很多麻烦;(权衡之道-利弊(相依相存)分析)
    缓存属于哪类的解决方案
    对需求的理解深度影响你的设计水平:
    日志埋点不可少的点
    资源的使用:能节省的地方一定要节省,达不到节省条件的不能节省,该怎么用就怎么用(不要因为存储影响了计算,存储容量不是技术问题)?
    设置多少线程合适?并不是依据你cpu的核数而定的?
    网络服务超时分析:
    思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发
    python selenium 处理时间日期控件
  • 原文地址:https://www.cnblogs.com/ZhengQiZHou/p/12627619.html
Copyright © 2011-2022 走看看