Spring整合Apollo的原理

news2024/11/18 13:37:42

Spring和Apollo源码涉及的类
Spring:ApplicationContextInitializer、BeanFactoryPostProcessor、BeanPostProcessor、Environment、CompositePropertySource
Apollo:ApolloApplicationContextInitializer、PropertySourcesProcessor、ApolloProcessor、AutoUpdateConfigChangeListener、SpringValue

Environment和CompositePropertySource

这是Spring的Api,用来存储环境变量。Apollo通过CompositePropertySource向Environment注册了两个PropertySource,命名分别为:ApolloBootstrapPropertySources、ApolloPropertySources。
通过ConfigurableEnvironment#getPropertySources可以获取到Spring所有的属性配置。

ApolloApplicationContextInitializer和ApplicationContextInitializer

ApolloApplicationContextInitializer实现了ApplicationContextInitializer , EnvironmentPostProcessor, Ordered,通过spring.factories使其生效,优先级特别高。这个类在启动时向Environment注册CompositePropertySource,命名为ApolloBootstrapPropertySources,然后遍历命名空间,通过Apollo的ConfigPropertySourceFactory创建命名空间对应的ConfigPropertySource,添加到ApolloBootstrapPropertySources。这样Apollo和Spring共用了同一个对象,Apollo修改配置属性,Environment中的同时会修改,因为是同一个引用!
在这里插入图片描述

@EnableApolloConfig和DefaultApolloConfigRegistrarHelper

@EnableApolloConfig是自动配置的入口,通过DefaultApolloConfigRegistrarHelper把命名空间添加到PropertySourcesProcessor的NAMESPACE_NAMES属性中(下面说明);同时DefaultApolloConfigRegistrarHelper会初始化Apollo相关的bean放到Spring IoC。

PropertySourcesProcessor和BeanFactoryPostProcessor

PropertySourcesProcessor实现了BeanFactoryPostProcessor,向Environment注册CompositePropertySource,命名为ApolloPropertySources,遍历@EnableApolloConfig指定的命名空间,通过ConfigPropertySourceFactory获取对应命名空间的属性配置,添加到ApolloPropertySources,然后调整ApolloBootstrapPropertySources和ApolloPropertySources的顺序。同时初始化AutoUpdateConfigChangeListener ,用于实时监听配置的变更。
在这里插入图片描述
在这里插入图片描述

@Value如何动态修改?

ApolloProcessor、BeanPostProcessor、SpringValue

ApolloProcessor实现了BeanPostProcessor,在Spring bean初始化过程中,每个bean都会执行特定的动作。ApolloProcessor有如下三个子类,所有bean的初始化阶段都会执行。

  • ApolloAnnotationProcessor:筛选bean所有Fields和Methods,判断是否存在ApolloConfig和ApolloConfigChangeListener注解
  • SpringValueProcessor:判断bean的Fields和Methods是否存在@Value,把bean和@Value封装SpringValue,由SpringValueRegistry存储
  • ApolloJsonValueProcessor:判断是否存在@ApolloJsonValue
    在这里插入图片描述

AutoUpdateConfigChangeListener

当配置属性发生了变更,会更新到Apollo维护的配置属性(Environment的PropertySource引用了配置属性),因此Environment维护的属性也是最新的。然后Apollo会把变更的key丢给AutoUpdateConfigChangeListener,通过SpringValueRegistry查询key对应的SpringValue,拿到Spring bean,通过反射设置bean的属性,这样就更新了@Value标识的属性。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消息发布确认

描述:在消息投递的过程中可能会存在消息丢失的行为产生,生产者到交换机,交换机到队列的过程都有可能出现这个现象。所以我们要有个发布确认的操作来防止消息丢西。 确认机制方案: 配置文件配置交换机发布确认模式: p…

年终颁奖 | 建模助手年度产品经理正在评比当中!

大家好,我是建模助手。 12月来了,又到了激情总结,却发现flag倒被打脸的时刻!我就想问问在座各位:年初的定立的flag,完成得咋样了? 我们今年就有一张很优秀的成绩单:↓↓↓ 建模助手…

优优聚:学会删减菜单,帮你提升销量和转化

如今随着外卖市场的不断发展,越来越多的堂食店铺加入外卖,但是对于做外卖很多老板认为,自家堂食做得不错,那么直接把堂食的菜单上传到外卖,结果这样做的后果就是不仅累还不挣钱。下面优优聚小编就来讲一下。 1、菜单太…

IDEA 导入别人的javaweb项目进行部署

前言 我主要是进行java的springboot项目和vue项目的开发,但是架不住在这些框架兴起之前,公司内部已经是有其他的老的框架,我需要在这些老的框架进行修改和调整代码。原本我是使用的eclipse软件进行部署,也比较简单; …

了解常见的模拟器及交换机的基本配置

了解常见的模拟器及交换机的基本配置 1. 首先我们先了解常见的模拟器软件 1.Cisco Packet Tracer(简单,纯软件实现) Cisco Packet Tracer 是由Cisco公司发布的一个辅助学习工具,为学 习思科网络课程的初学者去设计、配置、排除…

chapter9——电磁兼容性能设计指南

目录1.定义2.电磁干扰理论3.电磁干扰的流程、标准和认证4.影响集成电路抗干扰性能的几个因素5.减少EMC/EMI的技术电子线路易于接收来自其他发射器的辐射信号,无论是有意或无意发射。这些电磁干扰(EMI)使得设备内毗邻的元件不能同时工作。这时…

58同城首页腰部动态化技术选型(布局动态化)

1. 行业情况 1.1 基本概念介绍 1.1.1 Web混合 Web 前端和客户端的混合开发。使用 WebView 进行页面渲染、逻辑执行;依赖客户端的能力需要通过 JSBridge(通信桥) 的方式进行调用,比如调用客户端的相册、定位、登陆、埋点能力。 1.1.2 小程序 小程序体…

【Redisson源码】可重入锁看门狗机制

【本篇文章基于redisson-3.17.6版本源码进行分析】 为什么需要自动续期? 设想一下,如果我们指定的锁的超时时间是30秒,但是业务执行在30秒内还没有执行完成,此时分布式锁超时过期自动释放,其它线程就能获取到这把锁&…

OpenGL基础图形编程(八)变换

八、OpenGL变换 OpenGL变换是本篇的重点内容,它包括计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换,以及针对OpenGL的特殊变换概念理解和用法,如相机模拟、矩阵堆栈等。学好了这章,才开始真…

基于多时间尺度滚动优化的多能源微网双层调度研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

网络套接字编程(TCP协议)

文章目录简单的TCP网络程序服务器绑定服务端监听服务端获取连接客户端连接服务器多线程版本的大小写字母转换服务简单的TCP网络程序 int socket(int domain, int type, int protocol);参数说明: domain:创建套接字的域或者叫做协议家族,也就…

百万基建狂魔们的赛博世界

钉钉完成的,是基于PaaS底座和底层基础产品,与生态伙伴一起提供低代码的普惠化定制开发模式,让大型企业自己可以具备诊断自己的能力和梳理流程的能力,并且将过往的经验和积累进行数字化应用层面的表达,进而寻找出一条最…

ffplay调试环境搭建

前言 ffplay是基于FFmpeg的最简单的官方播放器。麻雀虽小,五脏俱全,虽说ffplay简单,但是各种播放器应有的功能一一俱全,说它简单或许仅仅是因为它只有一个点c文件而已吧。 想要开发一个优秀的播放器,参考是必不可少的&…

Netron可视化Pytorch保存的网络模型

目录 一.理清网络的输入与输出 二. 将模型转换为onnx格式 三.Netron可视化工具 一.理清网络的输入与输出 我自定义的网络模型(主要看看前向传播函数即可): import torch import torch.nn as nn#导入数据预处理之后的相关数据 from dataP…

Acrel-EMS企业微电网能效管理平台在某食品加工厂35kV变电站应用-Susie 周

1、概述 该食品加工厂变电站工程规模:电压等级:35/10.5kV,规划主变容量16.3MVA1台8MVA。有一个总配电室,包括35kV开关柜、10kV开关柜和0.4kV配电柜,两个独立变压器室,变压器为干式变压器。35kV供电系统采用…

(2)ITK中迭代器的时间效率

背景 ITK对图像处理中,为了提高代码运行效率,通过迭代器Iterator可以实现对时间的优化。 在ITK的官方文档中也有明确的说明: 针对此说明,本次使用对图像获取最大值最小值的方式,来实验和测试其效率。 代码实现 &am…

JDBC 数据库连接池之Driud

1 数据库连接池简介 数据库连接池是个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据…

数据安全新战场,EasyMR为企业筑起“安全防线”

2020年1月,时间跨度长达14年的,微软2.5亿条客户服务和支持记录在网上泄露; 同年4月,微盟发生史上最贵“删库跑路”事件,造成微盟市值一夜之间缩水约24亿港币; 今年7月,网信办依据《数据安全法…

PCIEBPMCx4板卡

PCIEBPMCx4本板卡可以使标准的PMC板卡安装于带有PCIE插槽的PC机上使用,安装后占一个槽位,槽位可以为PCIE x4 PCIE x8、PCIE x16,安装后工作在PCIE x4模式。PCIE X1 后开口也可以使用,但只运行在PCIE X1模式。PCIE支持X4 V2.0,板载…

Python对json的操作总结

Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中,所以对json的各种学习,是自然而然的事情。 J…