「造个轮子」——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 中的升级内容,包含了配置支持以及代码重构。其中有些内容我觉得对接触少的同学来说还是挺有帮助的。


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




相关文章
|
监控 druid
druid 连接池监控报错 Sorry, you are not permitted to view this page.
druid 连接池监控报错 Sorry, you are not permitted to view this page.
2148 0
|
7月前
|
缓存 安全 网络协议
【Linux】已解决:There are no enabled repos. Run “yum repolist all” to see the repos you have. You can en
【Linux】已解决:There are no enabled repos. Run “yum repolist all” to see the repos you have. You can en
1285 1
【已解决】Error: Element type is invalid: expected a string (for built-in components) or a class/function
Error: Element type is invalid: expected a string (for built-in components) or a class/function
2594 0
【已解决】Error: Element type is invalid: expected a string (for built-in components) or a class/function
|
9月前
|
网络协议 安全 网络安全
|
8月前
|
API Android开发
32. 【Android教程】对话框:AlertDialog
32. 【Android教程】对话框:AlertDialog
134 2
|
9月前
|
存储 缓存 程序员
CPU组成结构
CPU组成结构
411 0
|
9月前
|
Shell 应用服务中间件 Docker
kubectl创建简单的pod
kubectl创建简单的pod
|
9月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
9月前
|
运维 安全 网络安全
通过Xshell连接有跳板机/堡垒机的服务器
通过Xshell连接有跳板机/堡垒机的服务器
877 0
|
分布式计算 Hadoop Java
Windows本地安装Hadoop
Windows本地安装Hadoop
410 0
Windows本地安装Hadoop

热门文章

最新文章