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

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

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

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

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

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

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

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

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

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

后缀为 .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 来获取文件输入(敢问,有必要这么绕来绕去吗?不过,无所谓,继续往下看!)

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

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

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

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

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

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

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

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

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

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

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

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

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

    灵魂拷问:YAML,在项目中用过没?它与 properties 文件啥区别? 目前 SpringBoot.SpringCloud.Docker 等各大项目.各大组件,在使用过程中几乎都能看到 YAML ...

  2. java项目部署之后,Jar包中配置文件修改

    Java项目发布时,配置文件不像.net项目一样与工程路径保持一致,而是直接包含在了jar包中,此时要修改就没那么方便了,我们可以将配置文件从jar包抽离出来,修改完之后再写入Jar包即可, 也没那么 ...

  3. LinkedHashMap和HashMap的比较使用 由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下。 ? import java.util.HashMap; impo

    LinkedHashMap和HashMap的比较使用 由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下. import java.util.HashMap; import ...

  4. 转载:Java项目读取配置文件时,FileNotFoundException 系统找不到指定的文件,System.getProperty("user.dir")的理解

    唉,读取个文件,也就是在项目里面去获得配置文件的目录,然后,变成文件,有事没事,总是出个 FileNotFoundException  系统找不到指定的文件,气死人啦. 还有就是:System.get ...

  5. 统计Java项目的代码行数

    Java项目谈论行数多少有点无聊,但是有的时候就想看看一个开源的代码的量级,用Shell命令统计再合适不过了 去掉空行和注释: find . -name "*.java" |xar ...

  6. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

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

    java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. ...

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

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

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

    Java项目打包在CMD或者Linux下运行 1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压

随机推荐

  1. jenkins操作

    jenkins忘记用户名以及登录密码的解决方法 1.jenkins 根目录下找到config.xml,修改配置  <useSecurity>true</useSecurity> ...

  2. flask修改flask_wtf使其支持json数据的validation验证

    flask默认是前后端不分离策略,前端通过flask+wtf表单来传递post,put...等数据. 现在前后端分离是趋势,那么对flask进行一定的修改,变为前后端分离,在前端页面中请求后端,那么请 ...

  3. python爬虫的数据库连接问题

    1.需要导的包 import pymysql 2.# mysql连接信息(字典形式) db_config ={ 'host': '127.0.0.1',#连接的主机id(107.0.0.1是本机id) ...

  4. Flink消费Kafka到HDFS实现及详解

    1.概述 最近有同学留言咨询,Flink消费Kafka的一些问题,今天笔者将用一个小案例来为大家介绍如何将Kafka中的数据,通过Flink任务来消费并存储到HDFS上. 2.内容 这里举个消费Kaf ...

  5. 【原创】(求锤得锤的故事)Redis锁从面试连环炮聊到神仙打架。

    这是why技术的第38篇原创文章 又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活. 有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我的照片.拍照的地方,名字叫做牛背山,一个名字很 ...

  6. postman小工具

    进入lmm后,做接口测试使用的是postman,以前稍微接触过,但是不是很会用,这里就自学顺便总结一下,以便以后或者能帮助到别人,如果有什么不同的意见或者有错误,请毫不客气的指出,感谢! 推荐一篇博客 ...

  7. CSRF攻击原理及预防手段

      CSRF全程 Cross Site Request Forgery, 跨站域请求伪造.这种攻击方式相对于XSS,SQL注入等攻击方式比较晚被发现,今天就来讲解下这种攻击方式以及避免方式. 攻击过程 ...

  8. SpringBoot2整合Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the calling code 【已解决】

    SpringBoot集成Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the callin ...

  9. Chrome开发者工具之测试应用

    一.Chrome开发者工具简介 浏览器的开发者工具(DevTools)可以帮助开发人员对网页进行布局,比如HTML+CSS,帮助前端工程师更好的调试脚本(JavaScript.jQuery)之类的,还 ...

  10. java网络编程——多线程数据收发并行

    基本介绍与思路 收发并行 前一篇博客中,完成了客户端与服务端的简单TCP交互,但这种交互是触发式的:客户端发送一条消息,服务端收到后再回送一条.没有做到收发并行.收发并行的字面意思很容易理解,即数据的 ...