天天看点

单体SpringBoot整合Apollo实现@ConfigurationProperties属性刷新

本文主要分享了单体SpringBoot(非SpringCloud)整合Apollo中,如何实现@ConfigurationProperties的属性刷新。

一、问题描述

在SpringCloud微服务中,相信很多小伙伴都用过以下方式去解决下@ConfigurationProperties的属性刷新

单体SpringBoot整合Apollo实现@ConfigurationProperties属性刷新

但在单体SpringBoot项目中就不好使了,因为EnvironmentChangeEvent的全路径是org.springframework.cloud.context.environment.EnvironmentChangeEvent,该类在spring-cloud-context-xxx.jar中,而单体SpringBoot应用通常情况下是不依赖SpringCloud的jar的。

单体SpringBoot整合Apollo实现@ConfigurationProperties属性刷新

二、解题思路

问:能否把EnvironmentChangeEvent的逻辑从spring-cloud-context-xxx.jar复制出来使用?

答:是可以的

1.找到EnvironmentChangeEvent的消费者逻辑所在类ConfigurationPropertiesRebinder(属性刷新的逻辑就在这里)

2.将ConfigurationPropertiesRebinder所依赖的类也复制出来,发现只有ConfigurationPropertiesBeans

3.所以需要复制的类只有3个:EnvironmentChangeEvent、ConfigurationPropertiesRebinder、ConfigurationPropertiesBeans

单体SpringBoot整合Apollo实现@ConfigurationProperties属性刷新

4.在ConfigurationPropertiesBeans.isRefreshScoped中有一段逻辑依赖RefreshScope,这块逻辑不需要,所以可以直接注释掉

单体SpringBoot整合Apollo实现@ConfigurationProperties属性刷新

5.PropertiesRefresher中引入复制出来的类EnvironmentChangeEvent,大功告成

在使用这种方式之前,作者本人也在网上找了很多资料,没能找到比较好的实现方式。突发灵感地往使用springcloud源码的方向试了一下,发现还真的可行。在此记录以分享各位码友。

怎么样?如果你觉得有用的话,还不快快收藏起来!!!