Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】

1. 原理

SpringBoot中提供了热部署插件spring-boot-devtools来提高开发效率,他的原理其实就是两个类加载器:

  • base classloader:用来加载那些不会变化的类,例如各种第三方依赖;
  • restart classloader:用来加载那些会发生变化的类,例如你自己写的代码

Spring Boot 中热部署的原理就是当代码发生变化时,base classloader 不变,而 restart classloader 则会被废弃,被另一个新的 restart classloader 代替。在整个过程中,因为只重新加载了变化的类,所以启动速度要比重启快。

注意:如果是编辑器是intellij IDEA,需要配置为自动重建:
Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】_第1张图片
在On Update action中选择Update trigger file,在调用Update操作时触发DevTools的Restart;甚至可以选择尝试热插拔的选项,并仅在热插拔失败时使用DevTools重新启动。在On frame deactivation中选择Update classes and resources,在IDEA窗口失去焦点时重新加载所有静态资源和模板(例如,切换到浏览器窗口时):
Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】_第2张图片
确认后,修改源码,切换到浏览器,刷新浏览器,可以看到更新后的结果,如果还不行按(Ctrl + F10)强行更新重启。

2. 静态资源热部署

但是使用 devtools ,默认情况下当静态资源发生变化时,并不会触发项目重启。通过上面配置了On Update action和On frame deactivation后,修改静态资源后刷新浏览器即可,其实静态资源也可以实现热部署。

devtools 中默认嵌入了 LiveReload 服务器,利用 LiveReload 可以实现静态文件的热部署,LiveReload 可以在资源发生变化时自动触发浏览器更新,LiveReload 支持 Chrome、Firefox 以及 Safari 。

需要先在浏览器中安装LiveReload插件,安装过程自行百度,安装好之后:
在这里插入图片描述
然后在pom.xml中添加依赖:

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

然后启动项目,需要观察控制台是否输出LiveReload服务启动成功:

  • 输出 Unable to start LiveReload server,表示启动失败,主要是LiveReload服务端口35729被占用,关闭即可。
  • 输出 LiveReload sever is running on port 35729,则表示启动成功。
    Spring/SpringBoot系列之SpringBoot使用spring-boot-devtools实现后端热部署、前端自动刷新(热部署)【十七】_第3张图片

测试的话随便打开一个html页面,然后点击浏览器右上角的 LiveReload 按钮,打开 LiveReload 连接。这时修改html中的内容后浏览器就会自动刷新,不需要手动保存然后刷新,而整个项目并没有重启。

3. LiveReload注意事项

  • LiveReload 是和浏览器选项卡绑定在一起的,在哪个选项卡中打开了 LiveReload,就在哪个选项卡中访问页面,这样才有效果。
  • 如果安装并且启动了 LiveReload 插件,同时也添加了 devtools 依赖,但是却并不想当静态页面发生变化时浏览器自动刷新,那么可以关闭插件连接,或者在 application.properties 中添加如下代码进行配置:
    spring.devtools.livereload.enabled=false
    
  • 建议开发者使用 LiveReload 策略而不是项目重启策略来实现静态资源的动态加载,因为项目重启所耗费时间一般来说要超过使用LiveReload 所耗费的时间。
  • Spring Boot DevTools的用法仅用于开发,而不用于生产。如果应用程序检测到生产中运行,则会自动禁用DevTools。部署时有两种模式:fully packaged artifact完全打包和exploded artifact ;采取前者打包方式Spring会认为是生产应用;后者认为是开发模式,在Idea等IDE中采取的是后者。
  • 使用DevTools的Spring应用程序会自动启动LiveReload服务器。不幸的是,此服务器中只有一个实例可以同时运行。更确切地说,只有第一个可行。
  • DevTools通常应该正常运行,但它可能与第三方库有冲突。已知的是使用标准ObjectInputStream进行反序列化时可能存在冲突。如果发生此类冲突,可以通过设置禁用自动重启:
    spring.devtools.restart.enabled=false
    
    但是,仍将使用重新启动类加载器restart classloader。如果需要完全禁用类加载器,则需要在启动应用程序之前执行此操作:
    public static void main(String args) {
    	System.setProperty("spring.devtools.restart.enabled", "false");
    	SpringApplication.run(MyApp.class, args);
    }
    

你可能感兴趣的:(java,spring,boot)