Seata源码笔记(二)
Seata源码笔记(二)
- 配置相关的
- ConfigurationFactory
- 静态代码块
- load():融入spring获取value的方式
- Configuration的get方法拦截后,value取值优先级
- ObjectHolder
- PROPERTY_BEAN_MAP
- getInstance
- buildConfiguration
- reload
基于incubartor-seata-2.x
配置相关的
ConfigurationFactory
静态代码块
initOriginConfiguration和maybeNeedOriginFileInstance逻辑较为简单,主要看看load
private static final String REGISTRY_CONF_DEFAULT = "registry";
private static final String ENV_SYSTEM_KEY = "SEATA_ENV";
public static final String ENV_PROPERTY_KEY = "seataEnv";private static final String SYSTEM_PROPERTY_SEATA_CONFIG_NAME = "seata.config.name";private static final String ENV_SEATA_CONFIG_NAME = "SEATA_CONFIG_NAME";public static volatile Configuration CURRENT_FILE_INSTANCE;public static volatile FileConfiguration ORIGIN_FILE_INSTANCE_REGISTRY;public static volatile FileConfiguration ORIGIN_FILE_INSTANCE = null;static {// 负责初始化ORIGIN_FILE_INSTANCE_REGISTRY,通过读取registry.conf(<configName>-<envName>.conf)initOriginConfiguration();// 初始化CURRENT_FILE_INSTANCE(判断是否有extConfiguration,没有就用ORIGIN_FILE_INSTANCE_REGISTRY,本来FileConfiguration就是Configuration的实现)// ext默认有个SpringBootConfigurationProvider实现,返回一个代理对象(seata-spring-autoconfigure-core里)load();// 如果CURRENT_FILE_INSTANCE是.conf的(也就是load用的还是registry.conf)// 那原配置文件ORIGIN_FILE_INSTANCE就用的registry.conf里的config.file.name(test中给的file.conf)maybeNeedOriginFileInstance();
}
load():融入spring获取value的方式
对应上述静态代码块里load部分(主要是通过SPI去找ExtConfigurationProvider的实现然后调用provide方法,目前唯一提供的实现SpringBootConfigurationProvider,它是通过动态代理创建一个Configuration的代理对象,来拦截并设置get方法获取的值)
public class SpringBootConfigurationProvider implements ExtConfigurationProvider {private static final Logger LOGGER = LoggerFactory.getLogger(SpringBootConfigurationProvider.class);private static final String INTERCEPT_METHOD_PREFIX = "get";private static final Map<String, Object> PROPERTY_BEAN_INSTANCE_MAP = new ConcurrentHashMap<>(64);@Overridepublic Configuration provide(Configuration originalConfiguration) {return (Configuration)Enhancer.create(originalConfiguration.getClass(),(MethodInterceptor)(proxy, method, args, methodProxy) -> {if (method.getName().startsWith(INTERCEPT_METHOD_PREFIX) && args.length > 0) {Object result;String rawDataId = (String)args[0];Class<?> dataType = ReflectionUtil.getWrappedClass(method.getReturnType());// 1. Get config value from the system propertyresult = originalConfiguration.getConfigFromSys(rawDataId);if (result == null) {String dataId = convertDataId(rawDataId);// 2. Get config value from the springboot environmentresult = getConfigFromEnvironment(dataId, dataType);if (result != null) {return result;}// 3. Get config defaultValue from the argumentsif (args.length > 1) {result = args[1];if (result != null) {// See Configuration#getConfig(String dataId, long timeoutMills)if (dataType.isAssignableFrom(result.getClass())) {return result;} else {result = null;}}}// 4. Get config defaultValue from the property objecttry {result = getDefaultValueFromPropertyObject(dataId);} catch (Throwable t) {LOGGER.error("Get config '{}' default value from the property object failed:", dataId, t);}}if (result != null) {if (dataType.isAssignableFrom(result.getClass())) {return result;}// Convert typereturn this.convertType(result, dataType);}}return method.invoke(originalConfiguration, args);});}...
}
Configuration的get方法拦截后,value取值优先级
result,也就是get方法的结果读取优先级:
环境变量(步骤1里getenv和getProperty)
ApplicationContext(步骤2里的ObjectHolder,很贴心的做了各种变换去找,下面会去看ObjectHolder怎么来的)
Configuration.getConfig(String dataId, String defaultValue…)(步骤3取默认值)
从PROPERTY_BEAN_MAP获取(步骤4,下面会去看PROPERTY_BEAN_MAP怎么来的)
ObjectHolder
seata-spring-autoconfigure-core的spring.factories配了个自动配置项SeataCoreAutoConfiguration



PROPERTY_BEAN_MAP
同上,seata-spring-autoconfigure-core的spring.factories配了个自动配置项SeataCoreEnvironmentPostProcessor,并且client和server包里也配置了SeataClientEnvironmentPostProcessor和SeataServerEnvironmentPostProcessor

getInstance
buildConfiguration
reload
工作去了,晚点更
相关文章:
Seata源码笔记(二)
Seata源码笔记(二) 配置相关的ConfigurationFactory静态代码块load():融入spring获取value的方式Configuration的get方法拦截后,value取值优先级ObjectHolderPROPERTY_BEAN_MAP getInstancebuildConfiguration reload 基于incubar…...
【Java SE】接口类型
在 Java 中,接口(Interface)是一种引用类型,类似于特殊的抽象类,用于定义一组方法规范,而不提供具体的实现。接口可以包含成员属性,这些属性默认是常量。尽管每个类只能继承一个父类,…...
[代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
理论基础 队列先入先出。 栈先入后出。 具体的实现和用法根据语言的不同而不同。 参考的文章 https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 232.用栈实现队列 这个定义入栈和出栈,往队列中加入…...
redis:RDB和AOF机制
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言RDBAOF总结 前言 redis是一个内存数据库,把数据存储在内存中的,而内存中的数据是不持久的,要想能够做…...
券商隔夜单自动下单交易接口
之前研究打板排板,研究怎么才能买得进去。 最近遇到几只利空跌停板,缩量跌停,明天大概率继续一字封板跌停。 如果卖不掉,意味着还要继续吃几个跌停,甚至ST票十几个跌停都有可能。 一次跌停亏几万,还是挺…...
生成任意3D和4D场景!GenXD:通用3D-4D联合生成框架 | 新加坡国立微软
文章链接: https://arxiv.org/pdf/2411.02319 项目链接:https://gen-x-d.github.io/ 有视频 亮点直击 设计了一个数据整理流程,从视频中获取包含可移动物体的高质量4D数据,并为30,000个视频标注了相机姿态。这个大规模数据集称为CamVid-30K&…...
通过命令学习k8s
1、kubectl 命令可以列出所有命令 2、kubectl version 命令可以查看版本号 3、kubectl cluster-info命令可以查看集群信息(192.168.218.136:6443 即为kube-apiserver的IP和端口。) [rootk8s-master ~]# kubectl cluster-info Kubernetes master is run…...
【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)
序言 本文将引导读者探索Redis的世界,深入了解其发展历程、丰富特性、常见应用场景、使用技巧等,最后会对Redis演进过程中具有里程碑意义的版本进行详细解读。 (一)初始redis Redis是一种基于键值对(key-value&#x…...
服务器显卡和桌面pc显卡有什么不同
服务器显卡和桌面 PC 显卡在设计目标、性能优化、功能支持和硬件规格上都有显著不同。以下是主要区别: 1. 设计用途 服务器显卡:主要用于计算、深度学习、数据分析、科学计算、虚拟化和图形渲染等任务。其设计目标是持续高负载计算,保证高稳…...
Chrome使用IE内核
Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面,之后重启chrome浏览器即可...
类和对象(C++)——默认成员函数,构造函数,析构函数
1. 类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载&#…...
深入理解 Vue v-model 原理与应用
一、引言 在 Vue.js 开发中,v-model是一个非常重要且强大的指令。它为开发者在处理表单输入和数据双向绑定等场景中提供了极大的便利。无论是新手还是有经验的开发者,深入理解v-model对于高效地构建 Vue 应用至关重要。本文将对v-model进行深入剖析,从其基本原理、使用方式…...
内网域环境、工作组、局域网等探针方案
1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息,为后续判断服务器角色,网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务(受权限影响) 了解当前服务器的网络接口信息…...
uniapp—android原生插件开发(3Android真机调试)
本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 一、打包uniapp资源包: 打包…...
goframe开发一个企业网站 统一返回响应码 18
响应码的logic package returncodeimport ("context""gf_new_web/internal/service""github.com/gogf/gf/v2/errors/gcode""github.com/gogf/gf/v2/frame/g" )type sReturncode struct { }var (insReturncode sReturncode{}…...
基于STM32的智能门禁系统设计
引言 本项目基于STM32微控制器设计了一个智能门禁系统,通过集成多个传感器模块和控制设备,实现对门禁系统的自动化管理与控制。该系统能够通过RFID卡、密码输入、以及指纹传感器等多种方式对进出人员进行验证,并结合LCD显示屏提供实时信息反…...
Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归
那就祝我们爬不同的山,还能回到同一条路上,不是时时见面,但是时时惦记之人 —— 24.11.13 递归 1.什么是递归 递归在编程中是一种非常重要的算法 递归:即方法(函数)自己调用自己的一种特殊编程写法 函数调用自己,即…...
知识见闻 - 苹果手机拨号键长按
苹果手机(iPhone)在拨号界面长按按键时有一些特定的功能。以下是iPhone拨号键盘上长按按键的主要功能: 数字键 0 - 长按可输入""号,用于国际电话拨号 - 这是最常用的长按功能之一,方便用户拨打国际电话 星号…...
在 KubeVirt 中使用 GPU Operator
在 KubeVirt 中使用 GPU Operator 基于最新的GPU Operator版本24.9.0。 原文链接:GPU Operator with KubeVirt — NVIDIA GPU Operator 24.9.0 documentation 1. 简介 KubeVirt 是 Kubernetes 的一个虚拟机管理插件,允许您在 Kubernetes 集群中运行和…...
安慰剂检验Stata代码(全套代码、示例数据及参考文献)
数据简介:随着因果推断方法在实证研究中的使用比例不断提升,越来越多的文章进行安慰剂检验。其检验基本原理与医学中的安慰剂类似,即使用假的政策发生时间或实验组进行分析,以检验能否得到政策效应。如果依然得到了政策效应&#…...
从农田到实验室:大疆P4M多光谱数据与ASD地物波谱仪实测数据对比实操指南
从农田到实验室:大疆P4M多光谱数据与ASD地物波谱仪实测数据对比实操指南 当无人机掠过农田上空,搭载的多光谱传感器正在以厘米级分辨率记录作物的生理状态。这些数据能否真实反映地表反射特性?本文将以大疆P4M多光谱无人机与ASD FieldSpec系…...
RWKV7-1.5B-G1A快速上手:5分钟部署你的轻量级文本生成助手
RWKV7-1.5B-G1A快速上手:5分钟部署你的轻量级文本生成助手 1. 为什么选择RWKV7-1.5B-G1A 如果你正在寻找一个轻量级但功能强大的文本生成模型,RWKV7-1.5B-G1A绝对值得考虑。这个基于RWKV-7架构的模型在1.5B参数规模下展现了出色的性能,特别…...
Pixel Aurora Engine惊艳图集:基于‘进化像素’哲学的跨时代视觉融合
Pixel Aurora Engine惊艳图集:基于进化像素哲学的跨时代视觉融合 1. 像素极光引擎概览 Pixel Aurora Engine是一款革命性的AI绘图工作站,它将现代扩散模型技术与复古像素艺术完美融合。这款工具重新定义了数字艺术创作方式,让用户能够通过简…...
2026年AI Agent将迎来爆发!这五大趋势将重塑企业未来,你准备好了吗?
2026年AI Agent将进入规模化部署阶段,应用渗透率将大幅提升。文章分析了五大核心趋势:多智能体协同、企业级部署规模化、行业垂直化、可信性与透明度提升,以及人机协作模式重构。同时,文章也提醒企业需警惕项目失败风险࿰…...
从Android大神到AI先锋!10年程序员血泪转型路,AI工程师高薪秘诀全公开!
一眨眼,我已经工作 10 年了。 在 2022 年以前,我一直相信,在这个行业里,只要技术栈钻得深,比如精通三方框架、熟悉 Android Framework、搞定性能优化,就能端稳饭碗。 但从 2023 年开始,一切都变…...
从激光雷达到AI服务器:实战解析PCIe高速走线在车载与数据中心的不同设计策略
从激光雷达到AI服务器:实战解析PCIe高速走线在车载与数据中心的不同设计策略 在硬件设计领域,PCIe总线技术已经成为了高速数据传输的事实标准。从自动驾驶汽车的激光雷达到数据中心的AI加速卡,PCIe的身影无处不在。然而,看似相同的…...
为什么你的Windows 11需要专业优化:4步高效解决方案
为什么你的Windows 11需要专业优化:4步高效解决方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cust…...
AI赋能:让快马平台解析21届智能车赛规则并生成智能算法代码
最近在准备21届智能车比赛时,发现今年的赛道规则特别复杂,各种新加入的元素和评分标准让人有点头大。正好尝试用InsCode(快马)平台的AI辅助开发功能来帮忙解析规则并生成算法代码,整个过程意外地顺利,分享下具体实现思路。 规则文…...
iarduino_KB矩阵键盘库:硬件感知型Arduino按键驱动方案
1. 项目概述iarduino_KB是由俄罗斯嵌入式开发团队 iArduino.ru 面向 Arduino IDE 推出的专用矩阵键盘驱动库。该库并非通用型扫描抽象层,而是针对其自研四款物理形态与电气特性高度定制化的柔性/机械式矩阵键盘模块进行深度适配的固件级解决方案。其核心价值在于将底…...
协方差矩阵可视化指南:如何用Seaborn热力图解读变量关系(附完整代码)
协方差矩阵可视化指南:如何用Seaborn热力图解读变量关系(附完整代码) 在数据分析的实际工作中,我们常常需要向非技术背景的决策者解释复杂的统计结果。这时候,一张直观的热力图往往比几十页的统计报告更有说服力。协方…...
