一、springboot、cloud配置的读取
1、springboot启动时会读取并解析配置文件中的配置到内存变量,保存在environment对象的属性中。如果引入了配置中心如nacos、apollo,其中的配置也会被springboot读取并保存在environment对象中。
2、可以使用编码的方式获取配置数据:
string name = environment.getproperty("name");
3、可以使用@value注解直接把配置赋值给bean的属性:
这里的name变量值直接来自于environment对象。
二、springcloud配置动态刷新
1、springboot配置文件和springcloud配置中心中的配置,区别只是来源不同,都是被读取加载到environment对象中生效的:
2、当配置中心修改了配置并发布时,server端会向client端发送配置变化通知,client端重新拉取配置并更新environment对象中的配置数据(通常通过事件发布和监听机制来实现)
此时如果使用编码方式从environment对象中获取配置(而不是@value注解的属性),则已经是更新后的值。
三、更新@refreshscope注解bean的属性值
1、对于使用@value注解获取配置的属性,不会随配置数据的更新而更新,因为bean对象已经创建完成,配置变化时只是更新environment中的数据,并没有更新bean属性值的动作发生。
2、但是如果bean上有@refreshscope注解,则其中的@value属性值会随配置更新而更新。
原理:使用@refreshscope标记的bean,spring会为其创建代理对象,代理对象中持有原生对象,@value的属性值位于原生对象中。springboot中的配置中心客户端在收到服务端的变更通知后,会先后发布两个事件:1、触发environment重新加载相关配置数据。2、触发所有@refreshscope的bean置为null,则在这些bean下次使用时重新创建,重新从environment中获取配置,即实现@value属性值的更新。
注:从springcloud配置动态更新的原理可知,诸如数据库连接配置,在配置中心修改了配置后只是会更新@refreshscope注解bean中的@value属性,如果要动态修改数据库信息,则还需要重建datasource对象、清除旧连接等操作。
以上就是springcloud配置动态更新原理解析的详细内容,更多关于springcloud配置动态更新的资料请关注代码网其它相关文章!
发表评论