前言
关于nacos客户端如何获取到服务端的配置信息的主流程源码分析和客户端拉取服务端变更的主流程源码分析在前两篇文章都分析过了,虽然读的人并不是很多,加起来也没有200个人阅读,也不知道是我写的不好,还是大家对nacos的源码并不感兴趣,不过既然是系列教程,我们还是要坚持把这个小系列教程做完,本小节本来要介绍nacos和spring boot整合的主流程源码分析的,但是思来想去,还是先花几个小节把spring boot的启动流程中涉及到的主要组件一起学习一下,这样可能分析nacos和spring boot整合时候,大家理解的可能会快一点,达到事半功倍的效果本文为原创文章,主要讲解spring boot一个核心组件EnvironmentPostProcessor,阅读本文大约7分钟,如果觉得本文写的不错,请给一个点赞或者关注一下,您的支持是我写作的最大动力
文章插图
EnvironmentPostProcessor功能说明EnvironmentPostProcessor从名字上看,叫做"环境后置处理器",它是一个接口,它可以再spring上下文启动的时候,去初始化一些基本配置信息,将某些变量信息,加载到spring容器上下文中,更加通俗的理解就是它可以用来解析加载我们自定义额外properties
举例来说:
1) 我们可以使用EnvironmentPostProcessor来加载json文件中的kv属性,将其解析到全局的环境变量里面,然后使用@Value来获取到信息
2)我们甚至可以使用EnvironmentPostProcessor来加载远程的配置,例如我们可以使用这个组件加载nacos的服务器的配置信息
EnvironmentPostProcessor 实战——加载本地json数据step1.编写测试数据
1.1.首先在spring boot的hello world项目的resource文件夹下新建一个测试的json——custom_properties文件,就写两个简单的kv值
文章插图
1.2.存在的位置在resources/json/custom_properties.json,格式如下
文章插图
step2.自定义EnvironmentPostProcessor
2.1.新建BazingaJsonEnvironmentPostProcessor,这个类主要是读取我们刚才写的cutom_properties.json的文本信息,然后加载到spring的Environment中,BazingaJsonEnvironmentPostProcessor继承我们今天的主角EnvironmentPostProcessor,这是一个接口,我们需要实现postProcessorEnvironment接口
文章插图
这个接口就是首先读取cutom_properties.json转换成流,然后将流读取成kv值,变成properties,最后写入到ConfigurableEnvironment中去,这样当spring的context开始初始化的时候,就能够在ConfigurableEnvironment中读取到变量,主要实现代码如下
文章插图
核心实现逻辑
2.2 我们有了自定义的BazingaJsonEnvironmentPostProcessor之后,还是不够的,还缺一个驱动力,springboot启动的时候,不会去主动读取我们自定义的类的,所以我们还需要利用spring boot的SPI机制,来加载我们的环境后置处理器,我们再resources下新建一个文件夹META-INF,然后在META-INF下新建文件spring.factories,整体结构如下图所示
文章插图
spring.factories
2.3 文件的内容也是有规范的,我们要指定spring的接口具体的实现类是我们自定义的
文章插图
到这边为止,我们所有的配置就到此结束了,最后我们写一个简单的测试controller,来测试一下我们自定义的两个KV能否在@Value这种注解中生效
文章插图
我们整体的项目骨架图如下图所示
文章插图
我们简单地运行一下localhost:8080/json/hello,可以在浏览器中成功展示我们的"您好,世界",这样我们就可以成功地将我们自定义的文件中的属性值,让spring boot加载到,并成功运用到我们真实的项目中去了,虽然很简单,但是这个组件EnvironmentPostProcessor的使用套路,大家还是要掌握的,很多优秀的源代码中都运用了这个套路,例如携程的Apollo.
EnvironmentPostProcessor的原理讲解我们已经初步懂得了EnvironmentPostProcessor的使用技巧,还有它的作用,在讲解原理之前,我们首先要记得一点,如果你有特殊的配置文件要加载的话,使用EnvironmentPostProcessor是很方便的,因为spring boot加载它的顺序是所有组件中最靠前的,等下我们分析看源码的时候,就能体会到这点了
推荐阅读
- 一文搞懂Python字符编码问题,值得收藏
- 一个启动U盘,10分钟装好全新win7系统
- 一文搞懂 PHP 数组的真正用法
- 10分钟不落的纸飞机折法 纸飞机折法
- Java基础一文搞懂Session和Cookie的用法及区别
- 一文搞懂单片机应用程序架构
- springboot配置文件切换讲解
- linux高级技巧:10分钟自主搭建keepalived
- 10分钟了解HTTP协议的前世今生
- 搞懂nginx 这一篇就够了