Java|不重启服务进行功能开发

文章导读 Java|不重启服务进行功能开发
文章图片


不重启服务进行功能开发
环境 Spring Boot 2.3.2 RELEASE +Mybatis-plus 3.2.2
不要看着这个环境不适合就跑了,不要怕,是通用的,只是我是在这种环境下写的JavaHotDevbugTool这个工具demo。
分析问题 我们在日常开发过程中,改得最多的无非是控制器、接口层,还是就是mapper xml;不管我们修改一个字母,还是更细微的改动,都需要重启服务,这个重启是重启整个Spring容器,粒度相当大,当我们应用包含了较多的bean的时候,重启的时候还是挺久的,像我现在接手的这个项目,就是10分钟,在开发调试阶段,这个时间是无法接受的,自然的就想着从两方面下手,一种方式是缩短启动时间,还有一种就是热部署(在不重启服务的前提下进行开发)。我选择了后者,因为前者需要对业务太大入侵性太大。
而热部署就很容易想到能不能增量部署,即没有变更的文件,我们就不去重新加载,只加载有变更的文件。
想想我们日常开发当中,改得最多的就是java文件和mybatis的xml文件,所以这篇文章就是要解决两个问题,java文件和xml文件的热更新问题。
Java文件热更新 DevTools介绍 spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
引用包

org.springframework.boot spring-boot-devtools true

Java|不重启服务进行功能开发
文章图片


配置pom并引用
重启服务 Java|不重启服务进行功能开发
文章图片


重启服务
测试效果 手动编译快捷键编译(ctrl + f9),网络上有很多帖子,说idea有一个保存的时候,自动编译功能,我几番设置没有成功,后来选择了手动编译,一个字:稳。
编译的本质可以简单的理解为是重新生成我们target文件下边的.class文件。
Java|不重启服务进行功能开发
文章图片


编译进度条
如果有类热更新了,会有相应的提示,如下图:
Java|不重启服务进行功能开发
文章图片


热更新代码
Java|不重启服务进行功能开发
文章图片


reload成功提示
可以更深入的进行打断点进行调试,都是有效果的,这里需要注意的一点:
不是java文件的所有地方都有效果,像新增文件、修改注解参数之类的是无效果的,和他的加载方式有关系,新增控制器什么的,只能重启服务。
解决了Java文件的热更新,我们继续看另外一个高频更改的mapper xml文件的热更新。
Mapper XML文件热更新 在Mybatis在3.0以前的版本,有一个MybatisMapperRefresh类,但是在3.0的版本移除改功能了,这也是为什么下边的配置无效的原因。
mybatis-plus: global-config: #刷新mapper 调试神器 refresh-mapper: true

我使用的3.3.2版本,因为我是在spring boot环境中使用,所以加上如下引用:
com.baomidou mybatis-plus-boot-starter 3.3.2

具体步骤
  1. 找到所有的mapper xml路径;
  2. 启动线程监听;
  3. 重新加载xml文件;
XmlMapperReload类 定义
// XmlMapperReload 类 public class XmlMapperReload implements Runnable {}

构造方法
// XmlMapperReload 构造方法 // mapperLocations:mapper xml 路径 // checkSeconds 多久检测一次 // enabled 是否开启 public XmlMapperReload(Resource[] mapperLocations, SqlSessionFactory sqlSessionFactory,int checkSeconds, boolean enabled) {}

开启监听
@Override public void run() {}

XmlMapperReload Bean Config
@Configuration public class XmlMapperReloadConfig {@Bean @Profile("dev") public XmlMapperReload xmlMapperReload(SqlSessionFactory sqlSessionFactory, MybatisPlusProperties mybatisPlusProperties) { return new XmlMapperReload(mybatisPlusProperties.resolveMapperLocations(), sqlSessionFactory, 2, true); } }

完整的源码,放在github上边了,可以拿来直接跑起来的项目,连接地址:
https://github.com/lianbian/JavaHotDevbugTool
重启服务 Java|不重启服务进行功能开发
文章图片


重启服务
测试效果 Java|不重启服务进行功能开发
文章图片


开始1条记录
Java|不重启服务进行功能开发
文章图片


删除limit 1
Java|不重启服务进行功能开发
文章图片


手动编译
Java|不重启服务进行功能开发
文章图片


5条记录全部显示
总结 【Java|不重启服务进行功能开发】这篇文章写到这里就完成了,几个注意点:
  1. 很多时候是因为idea自动编译没生效导致热部署失败,采用手动编译方式,也挺好的;
  2. 完整的简洁的项目代码放在了github上边(https://github.com/lianbian/JavaHotDevbugTool),需要的自取,拿着就能跑起来的项目,也可以文末的查看原文;
  3. 最后,就是注意细节。

    推荐阅读