Spring Loaded代码热更新实践和原理分析
开发者在编码效率和快速迭代中的痛点场景包括:
修改代码后,需要频繁重启应用,导致开发效率低下;
实时调试时,不能立即看到代码修改的结果;
(资料图片)
大型项目中,重启的时间成本较高。
针对这些问题,本文将深入探讨如何利用Spring Loaded热更新技术提高开发效率,减少编译和重启时间。分析Spring Loaded的热更新原理,以及实际应用过程中所需的操作和注意事项。
2、框架简介Spring Loaded is a JVM agent for reloading class file changes whilst a JVM is running. It transforms classes at loadtime to make them amenable to later reloading. Unlike "hot code replace" which only allows simple changes once a JVM is running (e.g. changes to method bodies),Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.
Spring Loaded 是一个 JVM 代理,可以在 JVM 运行时重新加载类文件的更改。它会在加载时转换类,以便稍后重新加载。与“热代码替换”只允许在 JVM 运行时进行简单更改(例如更改方法体)不同,Spring Loaded 允许您添加/修改/删除方法/字段/构造函数。还可以修改类型/方法/字段/构造函数上的注解,并且可以添加/删除/更改枚举类型中的值。
3、如何使用3.1 下载Agent插件https://repo1.maven.org/maven2/org/springframework/springloaded/1.2.8.RELEASE/springloaded-1.2.8.RELEASE.jar
3.2 引入Agent插件在jvm的启动命令中添加以下参数
-javaagent:/Users/you/runtime/springloaded-1.2.8.RELEASE.jar -noverify
3.3 修改并重新编译修改代码后执行Build->Recompile命令,可以看到在class reloaded完成后,程序的运行逻辑发生了变化
4、原理分析4.1 代码编译分析先来看一段源代码,这是一个RpcService类,定义了target字段、targetStatic静态字段和say方法,现在我们编译它。
public class RpcService { private String target = "rpc"; private static String targetStatic = "rpc static"; public String say() { return "RpcService say hello SpringLoaded" + target; }}
SpringLoaded对类编译后添加了一些跟踪记录字段,添加方法拦截判断。
public static ReloadableType r$type = TypeRegistry.getReloadableType(0, 1);public transient ISMgr r$fields;public static final SSMgr r$sfields;public String hello() { if (r$type.changed(0) == 1) { return r$type.fetchLatest()).say(this); } String targetNew = TypeRegistry.instanceFieldInterceptionRequired(1, "target") ? (String)r$get(this, "target") : this.target; return "RpcService say hello SpringLoaded" + targetNew;}
我们可以在代码运行时,使用getDeclaredField、getDeclaredMethod等函数在运行时获取类成员、方法信息,此时可以看到增强后的类多了如下字段和方法。
在编译后的代码中,我们可以看到RpcService类包含了一些新的字段和方法,这些都是Spring Loaded框架增加的。
•r$type是一个静态变量,其类型为ReloadableType。这个字段用于表示当前类的可重载类型,它包含了当前类的最新字节码和其他相关信息。
r\(get、r\)set方法是用于获取实例字段的值的方法,处理字段的拦截和替换。___clinit___方法是用于执行类的静态初始化块的方法。init()方法是用于处理类的构造函数的方法。在say()方法中增加了一个代码片段用于判断类是否发生了变更,如果变更了,则调用最新的可重载类型中的say()方法获取结果。否则,继续执行原有的方法体。在方法体中,也增加了一个代码片段用于判断本地变量是否需要拦截,如果需要,则使用r$get()方法获取非静态变量traget的值,并用它替换原有的变量值。4.2 运行过程分析1、在应用程序启动时,Spring Loaded在目标类路径中查找所有的类,并在ClassPreProcessor中使用自定义类加载器加载这些类,重新定义后存入TypeRegistry,用于缓存、变更对比和依赖关系维护。
2、注册一个文件变化监听器FileChangeListener,当一个类文件被修改后,Spring Loaded会检测到这个变化,并重新加载该类文件。
3、当一个类被重新加载时,Spring Loaded会尝试对比类的签名和继承关系没有改变,如果新的类定义与之前的类定义兼容,那么Spring Loaded会更新应用程序中的对象引用,以指向新的类定义。
5、总结Spring-loaded 使用 Java 的 Instrumentation API 在 JVM 启动时指定 Agent,使它能够在目标类加载之前进行拦截,并将目标类的字节码通过 ASM 库解析成抽象语法树(AST),然后对 AST 进行修改。修改的内容包括增加、删除、替换方法,修改方法体,添加字段等,最终替换目标类,改变其逻辑,实现对代码的热更新。
6、扩展内容•Jrebel也可以实现类似热更新功能,并且它更高效、稳定。jrebel官网
•Spring-boot-devtools也可以提升开发速度,但是它的方案更像是热重启。Spring Boot Devtools Restarter 原理
•如何自己实现一个热更新功能呢?思路大同小异,实现各有千秋。如何自己实现一个热加载?如何定义自己的类加载器?
作者:京东零售 程啸
来源:京东云开发者社区
关键词:
上一篇:环球快讯:曼城、热刺、波尔图等世界知名俱乐部青训队伍将齐聚申城
下一篇:最后一页
- 下半年房企净现金流将显著为负 违约风险难有实质性下降
- 徐州荣凯为南京荣盛置业提供不超过11亿元担保
- 天房发展收上交所问询函 包含转让吉利大厦44.81%股权事项
- 合景泰富回应整售写字楼:公司正常计划,并非为筹资
- 美好置业:延期至6月28日前回复深交所问询函
- 青岛公积金新政:首套住房贷款额度最高可达80万元
- 杭州:无房职工家庭公积金贷款购房最高可贷120万元
- 我爱我家全资持股上海相寓企业集团 后者注册资本2.5亿
- 龙湖集团副总裁温介邦已离职 此前兼任工程安全管理团队负责人
- 碧桂园拟以现金要约回购今年到期的6.834亿美元票据
-
碧桂园拟以现金要约回购今年到期的6.834亿美元票据
6月15日晚间,碧桂园发布公告称,公司计划以现金要约购买于2022年到期的尚未赎回4 75%优先票据。公告显示,上述票据在新交所上市,将于6月2
-
万科连续12个交易日回购约9.61亿元股份
6月15日,万科企业(02202 HK)发布翌日披露报表。于2022年6月15日,万科回购86 6万股A股,回购价格为17 75-17 99元,共耗资约1545 8万元。5
-
我爱我家:太和先机质押2.25亿股股份 占总股本9.55%
6月14日,我爱我家发布关于公司控股股东所持部分股份质押的公告。公告显示,为办理股票质押式回购交易进行融资,西藏太和先机投资管理有限
-
1-5月房屋新开工面积51628万平方米 下降30.6%
6月15日,国家统计局发布房地产数据显示,1-5月份,房屋新开工面积51628万平方米,下降30 6%。其中,住宅新开工面积37782万平方米,下降31
-
1-5月全国房地产开发投资52134亿元 同比下降4%
6月15日,国家统计局发布房地产数据显示,1-5月份,全国房地产开发投资52134亿元,同比下降4%。其中,住宅投资39521亿元,下降3%。
-
1-5月商品房销售面积50738万平方米 同比下降23.6%
6月15日,国家统计局发布房地产数据显示,1-5月份,商品房销售面积50738万平方米,同比下降23 6%;其中,住宅销售面积下降28 1%。商品房销售
-
1-5月房地产开发企业到位资金60404亿元 同比下降25.8%
6月15日,国家统计局发布房地产数据显示,1-5月份,房地产开发企业到位资金60404亿元,同比下降25 8%。其中,国内贷款8045亿元,下降26 0%;
-
女童不慎掉入20米深井 18岁小姨三次下井成功营救
陕西一女童不慎掉入20米深井 18岁小姨三次下井成功营救 中新网西安12月28日电 (记者 梅镱泷)记者28日从陕西消防了解到,近日,该
-
云南清水河边检站查获走私玉石和玉石毛料65公斤
中新网临沧12月28日电 (徐媛 雷珍玉)记者28日从云南清水河出入境边防检查站获悉,该站近日在清水河口岸查获一起利用货车藏匿走私玉石
-
新疆现代“织女”巧手织就幸福生活
中新社乌鲁木齐12月28日电 (苟继鹏 张尚坤)“我的爸爸、妈妈、姐姐都是纺织工人,受他们影响,2020年10月,我大学毕业后也应聘到一
X 关闭
深圳宝安成功挂牌出让一宗商业用地 计划添增世界500强总部
我爱我家:太和先机质押2.25亿股股份 占总股本9.55%
1-5月房屋新开工面积51628万平方米 下降30.6%
1-5月全国房地产开发投资52134亿元 同比下降4%
1-5月商品房销售面积50738万平方米 同比下降23.6%
X 关闭
环球快讯:曼城、热刺、波尔图等世界知名俱乐部青训队伍将齐聚申城
朗威股份登陆深交所,总市值达68.19亿元_快播
2022上半年各省gdp排名!
西红柿冷冻保存有害吗
世界讯息:北京市八大处公园发布声明:从未授权举办金秋祈福跑等活动