「造个轮子」——cicada 设计一个配置模块(下)

简介: 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。

查询出来之后自然是要进行遍历同时反射创建对象。


由于之前已经调用了

super.setPropertiesName("redis.properties");

来赋值配置文件名称,所以还需要在遍历过程中将 Properties 进行赋值。


同时在这里也体现出优先读取的是 VM 启动参数中的配置文件。


String systemProperty = System.getProperty(conf.getPropertiesName());



需要额外提一点的是:在查找所有用户自定义的配置管理类时需要手动将 cicada 内置的ApplicationConfiguration 加入其中。


因为使用应用的包名通过反射是查询不出该类的。


保存自定义配置管理


为了方便用户在使用时候可以随意的读取各个配置文件,所以还需要将反射创建的对象保存到一个内部缓存中,核心代码就是上上图中的这段代码:


// add configuration cache
ConfigurationHolder.addConfiguration(aClass.getName(), conf);


其中 ConfigurationHolder 的定义如下。



其实也是利用一个 Map 来存放这些对象。


这样在使用时候只需要取出即可。


KafkaConfiguration configuration = (KafkaConfiguration) getConfiguration(KafkaConfiguration.class);
String brokerList = configuration.get("kafka.broker.list");


重构


本次升级同时还重构了部分代码,比如启动类。


现在看上去要清爽和直接的多:



其中也有一点需要注意的地方。


大家如果查看日志的话会发现应用启动之后会打印本次的耗时,自然就是在启动时候记录一个时间,初始化完毕之后记录一个即可。



在之前的实现中由于都是在一个方法内,所以直接使用就行了。


但现在优化之后跨越了不同的方法和类,难道要把时间作为参数在各个方法之前传递嘛?


那未免太不优雅了。


所以 ThreadLocal 就有了发挥余地。


在初始化的方法中我将当前时间写入:


ThreadLocalHolder.setLocalTime(System.currentTimeMillis());


在最后记录日志的地方直接取出比较即可:



这样使用起来就完全不需要管什么参数传递了。


同时 ThreadLocalHolder 的定义:



这里还是有一点需要注意,在这种长生命周期的容器中一定得要记得及时清除


我这里的时间在查询一次之后就不用了,所以完全放心的在 getLocalTime() 方法中删掉。


总结


这就是本次 v1.0.2 中的升级内容,包含了配置支持以及代码重构。其中有些内容我觉得对接触少的同学来说还是挺有帮助的。


关于上两次的版本介绍请查看这里:




相关文章
|
8月前
|
安全 区块链 数据库
DAPP持币生息项目系统开发|步骤逻辑|源码案例
智能保证执行安全,并减少交易成本。智能合约允许在没有第三方的情况下进行可信交易,且交易可追踪、不可逆转
|
4月前
|
设计模式 网络协议 网络架构
软件工程师,学会封装不香么
软件工程师,学会封装不香么
42 0
|
5月前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
62 0
|
8月前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
1688 1
|
设计模式 SQL Java
有点狠有点猛,我用责任链模式重构了业务代码
文章开篇,抛出一个老生常谈的问题,学习设计模式有什么作用? 设计模式主要是为了应对代码的复杂性,让其满足开闭原则,提高代码的扩展性 另外,学习的设计模式 一定要在业务代码中落实,只有理论没有真正实施,是无法真正掌握并且灵活运用设计模式的 这篇文章主要说 责任链设计模式,认识此模式是在读 Mybatis 源码时, Interceptor 拦截器主要使用的就是责任链,当时读过后就留下了很深的印象(内心 OS:还能这样玩)
|
JavaScript 前端开发
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
基础的脚手架已经搭建完毕,如果我们想快速生成几个基础的组件模板我们可以使用Plop或者使用文件写入实现。比如我们不想等后端同学的接口,可以直接使用mock模拟数据生成。
290 0
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
|
NoSQL 算法 MongoDB
使用项目驱动学习编程的诀窍
使用项目驱动学习编程的诀窍
188 0
|
JavaScript API
我明白了,Vue3设计与实现-框架设计的核心要素读后感
第一章我已经觉得有所收获了,写的很精彩,接下来就是第二章了,框架设计的核心要素,应该是框架的大体轮廓的介绍吧。 构建产物、模块格式、警告信息、定位问题、开发和生产的区别、热更新的支持、树摇(去掉框架中没用到的功能代码)。
262 0
我明白了,Vue3设计与实现-框架设计的核心要素读后感
|
运维 监控 前端开发
程序员告别 996 第一步:1 人搞定一个项目,摆脱“重复造轮子”
程序员告别 996 第一步:1 人搞定一个项目,摆脱“重复造轮子”
251 0
程序员告别 996 第一步:1 人搞定一个项目,摆脱“重复造轮子”