阅读java开源框架源码或者自己开发系统时配置文件是一个不能忽略的,在阅读开源代码的过程中尝尝困惑配置文件是如何被读取到内存中的。配置文件本身只是为系统运行提供参数的支持,个人阅读源码时重点不大可能放在配置文件的解析上。如果通过某一个开源框架配置文件的加载、解析能触类旁通地在阅读其他配置文件或者在实际系统建设中合理应用配置文件,配置文件不再是分散阅读源码的关注点,那分析一个框架配置文件的加载、解析。

  本文分析Dubbo中配置文件的加载、解析。为什么选择Dubbo呢?巧合,因为阅读Dubbo源码的时候关于SPI总是关注这个配置文件是怎么被识别的,但是阅读Mybatis源码时完全没有。就是被配置文件转移了注意力。那就分析这个SPI相关的配置文件如何识别、加载、解析的吧。

  Dubbo扩展点相关配置文件的识别、加载的具体源码如下:

    

  策略保存了配置文件路径相关信息,即SPI中配置文件的识别在其中体现,本文不重点关注。本文重点关注基于ClassLoader加载的部分,具体分析loadDirectory源码,如下:

  上图将几段源码放在一起,可以看到关于配置文件的加载使用的基于JAVA基础的ClassLoader获取文件的绝对路径,配置文件的读取也使用的是大家熟悉的Java语言中BufferedReader等基础的基于InputStream,并不高深。

  其实基于ClassLoader或InputStream均可以单独读取配置文件,但是各有优缺:基于ClassLoader只能读取类路径下的配置文件,如果配置文件在类路径下使用该方式还是比较方便的;而基于InputStream的优点在于可以读取任意路径下的配置文件,但是得准确知道路径。

  Dubbo利用了ClassLoader的另一个功能获取了配置文件的绝对路径,这样基于InputStream读取配置文件的条件就成立了。没有直接使用ClassLoader,那就是Dubbo并没有约定SPI相关的配置文件必须在类路径下。

  下面就是具体的扩展类加载了:

  通过以上的调试,可知扩展基于ClassLoader将配置文件识别、加载、解析后最终保存到了extensionClasses的map中。map映射<key,value>的格式就是DubboSPI配置文件中“=”前后值。

  所以,其实基于ClassLoader配置文件的加载相对而言还是比较基础很好理解的。

Java基于ClassLoder/ InputStream 配合读取配置文件的更多相关文章

  1. selenium3+java+POM 跨浏览器测试之------读取配置文件

    我们知道,web 测试的时候是需要切换不同的浏览器以查看每个功能在不同浏览器上的运行情况,使得开发的程序更具有健壮性.本文先总结一下如何通过读取配置文件来切换浏览器. 具体步骤如下: 一.编写配置文件 ...

  2. java web路径和spring读取配置文件

    此篇博客缘起:部署java web系统到阿里云服务器(ubuntu14.04)的时候,有以下两个问题 找不到自定义的property配置文件 上传图片的时候找不到路径 开发的时候是在windows上的 ...

  3. Java从resources文件夹读取配置文件

    列举了2种方式,第一种是绝对路径,就是写死路径,不推荐 第二种是相对路径,使用到了ClassLoader package com.StadyJava.day22; import java.io.Fil ...

  4. java基于NIO的分散读取文件,然后统一聚合后写入文件

    分散读取:对于一个文件,可以分散的读取数据,可以快速的读取,好比多个线程在分段同时读取: 聚合写入:为了提高效率,一般读取到的数据都是分散的,要快速写入,就需要把分散的数据聚集在一起,然后一块写入到文 ...

  5. java读取配置文件的推荐方法getResource、getResourceAsStream

    在java开发中经常会读取配置文件,如果把文件路径写死,就太LOW了,也不符合编码规范. 在网上找了一些资料后,发现有两种方法:xxx.class.getResource("")  ...

  6. ResourceBundle与Properties读取配置文件

    ResourceBundle与Properties的区别在于ResourceBundle通常是用于国际化的属性配置文件读取,Properties则是一般的属性配置文件读取. ResourceBundl ...

  7. java读取配置文件(转)

    转载:http://blog.csdn.net/gaogaoshan/article/details/8605887 java 4种方式读取配置文件 + 修改配置文件     方式一:采用Servle ...

  8. java 4种方式读取配置文件 + 修改配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 方式一采用ServletContext读取读取配置文件的realpath然后通过文件流读取出来 方式二采用ResourceB ...

  9. Java 利用 ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件

    最近参与了github上的一个开源项目 Mycat,是一个mysql的分库分表的中间件.发现其中读取配置文件的代码,存在频繁多次重复打开,读取,关闭的问题,代码写的很初级,稍微看过一些框架源码的人,是 ...

随机推荐

  1. x86-3-段式管理(segmentation)

    x86-3-段式管理(segmentation) 3.1 段式管理概述: 从8086CPU开始,为了让程序在内存中能自由浮动而又不影响它的正常执行,CPU将内存划分成逻辑上的段来给程序使用. x86继 ...

  2. Java 在PDF中添加工具提示|ToolTip

    本文,将介绍如何通过Java后端程序代码在PDF中创建工具提示.添加工具提示后,当鼠标悬停在页面上的元素时,将显示工具提示内容. 导入jar包 本次程序中使用的是 Free Spire.PDF for ...

  3. 2018HPU暑期集训第四次积分训练赛 K - 方框 题解(图形打印)

    思路分析:题目已经明确透露了这道题的解法:就是画框.当 输入的边长  的话,就表示可以在内层继续嵌套一个方框.废话就不多说了,直接上代码吧! 代码如下: #include <iostream&g ...

  4. MySQL提权之udf提权(无webshell的情况)

    0x00 介绍 本篇我们来讲无webshell时利用udf进行提权 0x01 前提 1. 必须是root权限(主要是得创建和抛弃自定义函数) 2. secure_file_priv=(未写路径) 3. ...

  5. 论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》

    Paper Information Title:Convolutional Neural Networks on Graphs with Fast Localized Spectral Filteri ...

  6. rocketmq实现延迟队列精确到秒级实现方案1-代理实现

    简单的来说,就是rocketmq发送消息到broker的时候,判断是否定时消息, 如果是定时消息,将消息发送到代理服务(这个是一个独立的服务,需要自己开发,定时地把消息发送出去), 当然了消息用什么来 ...

  7. Solon Web 开发,十二、统一的渲染控制

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  8. [开发笔记usbTOcan]软件需求分析和软件架构设计

    前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...

  9. 使用Flightradar24's CesiumJS App追踪世界商用航线

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 每天,超过10万架商业航班在世界各地运送乘客.在任何特定时刻,您 ...

  10. 浅析DOM 与 html ,xml。

    DOM= Document Object Model,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构.是表示和处理一个HTML或XML文档的常用方法. DOM定义了 ...