转载

细数Java项目中用过的配置文件(ini 篇)

Java 菜鸟,会把可变的配置信息写死在代码里;Java 老鸟,会把可变的配置信息提取到配置文件中。 坊间流传这么一句非 科学 的衡量标准,来评判程序员的级别。

那么,项目中的配置信息,你平时都是怎样来实现的呢?你项目中用过哪些配置文件呢?

近期将结合实际项目或源码,说说这些年用过的那些有关配置的奇技淫巧,看看能否 帮你提高研发能力(那怕是提高一丢丢,就算成功)。

1.

后缀为 .ini 的文件,你用过没?

后缀为 .ini 的文件,是 Initialization File 的缩写,主要用于程序的初始化的一些配置参数,后缀当然也可以是 .conf、.cfg,只是项目中习惯上用后缀 .ini 罢了。

简单介绍一下,一个 ini 配置文件主要由节(section)、键值对组成。

细数Java项目中用过的配置文件(ini 篇)

如上图所示,ini 文件中,配置参数都是以节(section)为单位组合在一起的,每个节名字都被方括号包围着,像 owner、database 都被方括号括着。 每个节声明后的键值对都属于该 section,而且一个 section 没有结束标识符,一个节的开始就是上一个节的结束。

2.

后缀为 .ini 的文件,怎么用啊?

在自研框架或者业务项目开发中,往往会配置一些项目启动时要初始化的一些参数信息,例如端口、域名等等。 从老项目中截取一段,其实就配置键值对而已,很简单,有没有?

细数Java项目中用过的配置文件(ini 篇)

另外,项目研发中在面对身份验证、授权、密码和会话管理等需求时,经常会集成 Java 安全框架 Shiro,而  Shiro 就提供了使用 ini 文件,进行配置参数的能力(INI is easy to read, simple to use, and requires very few dependencies)。

细数Java项目中用过的配置文件(ini 篇)

后缀为 .ini 的文件,怎么解析啊?

老土方法: 用脚指头想出来的简单方法,往文件上插一根管子,直接采用 Properties 的 load 方法完成数据的读取,势必能达到解析的目的(脑补代码,懒得写代码啦)。

老土方法: 用手指头想出来的简单方法,往文件上插一根管子,一行一行去读,再按照等号拆分键值对,最后把键值对向 Map 放一下,必然也能达到解析的目的(脑补代码,代码懒得写啦)。

优雅方法: 看看 Shiro 咋搞的?项庄舞剑意在沛公。尝试告诉你:为什么 Java 轮子会多呢?这可能就是造轮子的其中一条路径,熟读源码,到处抄,哈哈。

3.

shiro.ini,到底人家怎么解析的?

细数Java项目中用过的配置文件(ini 篇)

首先,Shiro 加载 配置文件支持好几种方式,我们就挑 如何加载 类路 下的   shiro.ini  配置文件进行剖析 ,掌握这一条路径, 其它方式 殊途同归。

细数Java项目中用过的配置文件(ini 篇)

如上图源码所示,在加载 shiro.ini 配置文件前,首先会判断文件是否存在,存在则从类路径下进行加载,而且会发现 Shiro 把 ini 配置封装成了 Ini 对象( 这不就是面向对象 吗? Java 的核心思想: Every thing is object! )。

细数Java项目中用过的配置文件(ini 篇)

如上图源码所示,很显然会发现,具体读取 shiro.ini 配置的事情,就交给了 ResourceUtils 去办了( 术业有专攻,分工明确,各司其职 ),不过和咱们能想到的土方法也差不多,就是往文件上插一根管子,然后调用 load 方法进行读取。

细数Java项目中用过的配置文件(ini 篇)

通过上面源码截图,发现 load 方法只是稍微装饰了一下,把 InputStream 变成了 Reader( 设计模式:装饰器模式;面向对象的核心:多态 )。

细数Java项目中用过的配置文件(ini 篇)

看到上面的代码,会发现依然没有真正的读取,而是继续包装 Reader,变成 Scanner 来获取文件输入(敢问,有必要这么绕来绕去吗?不过,无所谓,继续往下看!)

细数Java项目中用过的配置文件(ini 篇)

到这儿,如上面截图所示,看到了庐山真面目,终于见到了一行一行进行读取内容,并进行截取其中的 section(节),也就是 shiro.ini 中配置的 [main]、[urls] 等等,接着把每个 section 下面的内容直接拼接在一起形成字符串,而此时,并没有拆分键值对。

细数Java项目中用过的配置文件(ini 篇)

如上面源码所示,很显然 Shiro 把 ini 配置的组件又封装成了 Section 对象( 再一次体会Java 的核心思想:Every thing is object! )。

不过,还记得配置文件咋配置的吗?把 shiro.ini 配置图再贴一次。

细数Java项目中用过的配置文件(ini 篇)

我们结合下面的源码,再去看上面这个段配置,顺道看看 Section 对象里面都有啥?

细数Java项目中用过的配置文件(ini 篇)

如上图源码标注 1,定义了一个 Map 用于保存配置的键值对信息;代码标注 2,是把上一步的字符串转换成 Map,具体转换如下图所示,按照等号进行拆分键值对,并放到 Map中。

细数Java项目中用过的配置文件(ini 篇)

仔细去看源码,会发现拆分键值对时,不仅仅是按照等号,但是 who care 呢?只因为到这儿,梗概已经了解个八九不离十啦。

细数Java项目中用过的配置文件(ini 篇)

好了,剖析的差多了,从源码去看反而感觉复杂了不少,其实际使用超级之简单,和咱们用手指头想的老土方法差不多,只是 Shiro 封装的稍微好一些。

但是,你有没有发现,有好多代码是可以简单抽一抽,你就可以直接应用到项目中的呢?

4.

它山之石可以攻玉, 相信会对你有所帮助。

行文至此,你肯定会有疑问,为什么不用 properties 啊?为什么不用 ymal 啊?其实说实话,黑猫白猫抓住老鼠都是好猫。

另外,为了能够帮你提高研发能力(那怕是提高一丢丢呢),后续将继续结合实际项目,看看用到的其它形式的配置文件,敬请期待。

参考:

https://en.wikipedia.org/wiki/INI_file

http://shiro.apache.org/web.html#web-ini-configuration

细数Java项目中用过的配置文件(ini 篇)

推荐阅读:

代码写了十余年,内心话儿聊不完

原文  http://mp.weixin.qq.com/s?__biz=MzU2MDg5NzYzNA==&mid=2247485178&idx=1&sn=84df43e6da1ecdc9ad4a5d864950a3e2
正文到此结束
Loading...