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. 峰哥说技术:09-Spring Boot整合JSP视图

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 09  峰哥说技术:Spring Boot整合JSP视图 一般来说我们很少推荐大家在Spring boot ...

  2. vue移动端字体大小设置

    const setRemUnit = () => { const docEl = document.documentElement; // IPhone6下750像素来设计,实际像素375px, ...

  3. js的变量——基本类型保存在栈中,引用类型保存在堆中

    javascript的基本类型:Undefined,Null,Boolean,Number,String 引用类型:Object,Array,Function 基本类型值在内存中占据固定大小,被保存在 ...

  4. 使用NPOI将Excel表导入到数据库中

    public string ExcelFile() { //指定文件路径, string fileName=@"d:\Stu.xls"; //创建一个文件流,并指定其中属性 usi ...

  5. 黑科技神器-uTools

    Hello,各位小伙伴们好,又到周末了,小黑哥给大家分享一款神器:『utools』. 官网地址:https://u.tools/ uTools 是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰 ...

  6. C++ 指针函数

    #include <stdio.h> #include <windows.h> using namespace std; template<typename T> ...

  7. C++ Dll中导出一个类

    //定义一个头文件,创建MyObject.h的头文件 并打印如下代码 #ifndef _MY_OBJECT_H #define _MY_OBJECT_H #ifndef MYDLL_EXPORTS # ...

  8. js 统计一个字符串中出现的字符最多的字符

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 常用计算机CMD 命令

      cd\  '返回到根目录  cd..  '返回到上一级目录 1 cd 显示当前目录名或改变当前目录. 2 dir 显示目录中的文件和子目录列表.  3 md 创建一个目录.  4 mkdir  创 ...

  10. Spring解决循环依赖,你真的懂了吗?

    导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...