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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. 它山之石可以攻玉

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

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

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

参考:

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

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

 

原文地址:https://www.cnblogs.com/socoool/p/12629714.html

时间: 2024-10-08 15:14:53

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

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

灵魂拷问:在不重启服务的前提下,如何让配置修改生效的呢?有什么奇技淫巧吗? 灵魂拷问:在 Java 项目中,总能看到以 .properties 为后缀的文件踪影,这类配置文件是怎么加载的呢? 项目研发过程中,总会遇到一些经常改变的参数,比如要连接的数据库的连接地址.名称.用户名.密码:再比如访问三方服务的 URL 等等.考虑到程序的通用性,这些参数往往不能直接写死在程序里,通常借助配置文件来优雅处理. 在 Java 项目中,properties 文件当属使用较简单一类,不过虽然简单,还是要好好说

JAVA Web项目中用到Redis的代码调试

JAVA Web项目中用到Redis的代码调试方法 在项目开发中用到了Redis,需要调试输出数据的正确性, 方法一:修改代码,暂时不从Redis取数据 方法二:清除Redis数据库中的所有key 登录Redis服务器,切换目录到Redis的目录: cd /opt/redis-2.8.13/src/ 清除Redis数据库中的所有key ./redis-cli flushall

Java项目读取配置文件时,找不到指定的文件???

唉,读取个文件,也就是在项目里面去获得配置文件的目录,然后,变成文件,有事没事,总是出个 FileNotFoundException 系统找不到指定的文件,气死人啦.还有就是:System.getProperty("user.dir"),都说获得的是"工作目录",有老铁们在意这个,工作目录怎么理解吗?我这做了个简单的测试.但是,你把这个配置文件放在项目的根目录下面,也就是 说你的项目文件夹下面直接放一个配置文件,这个时候,就可以,啥前缀不加的,就可以读取到,这个配置

Java项目打包在CMD或者Linux下运行

1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压 解压后,在CMD中进入项目根目录下,运行程序: Oracle2Redis-jar>java -cp .\lib\*; oracle.xxx.xx.cn.ReadOracle2Redis 2.在Linux中运行 把解压后的文件夹上传到Linux系统中,在项目根目录中运行: java  -cp ./lib/*: oracle.xxx.xx.cn.ReadOracle2Redis (跟Windows下路径分隔符(\

Java学习-007-Log4J 日志记录配置文件详解及实例源代码

此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-1-30 13:54:02,请知悉. 所需的 jar 包下载链接为:http://yunpan.cn/cKE56sxqtQCfP  访问密码 63d8 有关 Log4J 日志文件中日志级别及文件配置的详细情况,在 Log4J 的配置文件(xml.properties)中有详细的介绍,敬请参阅!

java项目——数据结构实验报告

java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. 3.API的编写,并导出. 4.使用TDD模式,对程序进行测试,利用TestSuite将各测试类整合到一起. 5.与小组成员实现代码的整合. 实验设计过程 首先自学集合框架章节的内容,初步设计相关的类. 根据数据结构课本的章节分类,实验各数据结构类. 在类的编写过程中,经过老师的指导,我准备使用泛型

java项目测试log4j

.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: nowrap; color: #6d180b; font-family: Consolas, "Liberation Mono", Courier, monospace; font-size: 16px } 一.基础入门 1.1 下载安装 下载相应的log4j-1.2.15.jar(也可以下载

细数空格缩进在开发中的坑

没错,这是一篇火药文.网上流传的各种编程规范几乎青一色都是说用空格代替Tab,其理由几乎都是“这是唯一能保证在所有环境下获得一致展现的方法”. 那我想问一句,你们到底能要多少种环境要看代码??? 1.用Windows自带的记事本?那我只能说,你继续装,看你什么时候才能完成得了任务.2.连接到Linux服务器上使用VI或者VIM?我也只能说只有改服务器的配置文件的时候才会这样做吧,而且如果是配置文件比较复杂也是下载下来用Notepad++改清晰很多好伐,比如Aapche的配置文件在Notepad+

Gradle在大型Java项目上的应用

在Java构建工具的世界里,先有了Ant,然后有了Maven.Maven的CoC[1].依赖管理以及项目构建规则重用性等特点,让Maven几乎成为Java构建工具的事实标准.然而,冗余的依赖管理配置.复杂并且难以扩展的构建生命周期,都成为使用Maven的困扰. Gradle作为新的构建工具,获得了2010 Springy大奖,并入围了2011的Jax最佳Java技术发明奖.它是基于Groovy语言的构建工具,既保持了Maven的优点,又通过使用Groovy定义的DSL[2],克服了 Maven中