不重启服务进行功能开发

2022年05月13日 阅读数:5
这篇文章主要向大家介绍不重启服务进行功能开发,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

文章导读

不重启服务进行功能开发java

环境

Spring Boot 2.3.2 RELEASE +Mybatis-plus 3.2.2git

不要看着这个环境不适合就跑了,不要怕,是通用的,只是我是在这种环境下写的JavaHotDevbugTool这个工具demo。github

分析问题

咱们在平常开发过程当中,改得最多的无非是控制器、接口层,仍是就是mapper xml;无论咱们修改一个字母,仍是更细微的改动,都须要重启服务,这个重启是重启整个Spring容器,粒度至关大,当咱们应用包含了较多的bean的时候,重启的时候仍是挺久的,像我如今接手的这个项目,就是10分钟,在开发调试阶段,这个时间是没法接受的,天然的就想着从两方面下手,一种方式是缩短启动时间,还有一种就是热部署(在不重启服务的前提下进行开发)。我选择了后者,由于前者须要对业务太大入侵性太大。spring

而热部署就很容易想到能不能增量部署,即没有变动的文件,咱们就不去从新加载,只加载有变动的文件。sql

想一想咱们平常开发当中,改得最多的就是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,因为须要加载的类相比较少,因此实现了较快的重启时间。mybatis

引用包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

配置pom并引用app

重启服务

重启服务ide

测试效果

手动编译快捷键编译(ctrl + f9),网络上有不少帖子,说idea有一个保存的时候,自动编译功能,我几番设置没有成功,后来选择了手动编译,一个字:稳。spring-boot

编译的本质能够简单的理解为是从新生成咱们target文件下边的.class文件。

编译进度条

若是有类热更新了,会有相应的提示,以下图:

热更新代码

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环境中使用,因此加上以下引用:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

具体步骤

  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

重启服务

重启服务

测试效果

开始1条记录

删除limit 1

手动编译

5条记录所有显示

总结

这篇文章写到这里就完成了,几个注意点:

  1. 不少时候是由于idea自动编译没生效致使热部署失败,采用手动编译方式,也挺好的;
  2. 完整的简洁的项目代码放在了github上边(https://github.com/lianbian/JavaHotDevbugTool),须要的自取,拿着就能跑起来的项目,也能够文末的查看原文;
  3. 最后,就是注意细节