SpringBoot-学习-3-热部署

文章目录

  • 前言
  • 一、为什么需要热部署
  • 二、具体实现
    • 1.添加spring-boot-devtools依赖
    • 2. IDEA工具热部署设置
    • 3.测试热部署的效果
  • 三、原理分析
    • 1.官网解释
    • 2.手动验证
  • 四、排除资源
  • 总结


前言

在开发项目过程中,当修改了某些代码后需要本地验证时,需要重启本地服务进行验证,启动这个 项目,如果项目庞大的话还是需要较长时间的,spring开发团队为我们带来了一个插件:spring-boot- devtools,很好的解决了本地验证缓慢的问题。


一、为什么需要热部署

我们作为开发者,在日常的项目开发过程中肯定经常需要调试、修改、调试、修改…这样的循环往复,但每次我们修改了类路径下的文件时正常都需要重启项目然后进行验证,这种方式可以称之为冷启动,它既要重新加载我们开发的项目里的文件,同时也要重新加载依赖的所有第三方依赖,如果项目庞大的话这个时间会很长,尤其是我们在对大项目进行维护或开发新功能的时候可能大部分时间都浪费在了启动项目上,这个时候如果采用热部署就会极大地提高开发调试的效率

二、具体实现

这里使用的工具是idea,所以就以idea为例

1.添加spring-boot-devtools依赖

<!--热部署依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>2.6.3</version>
</dependency>

2. IDEA工具热部署设置

选择IDEA工具界面的【File】->【Settings】选项,打开Compiler面板设置页面
SpringBoot-学习-3-热部署_第1张图片
但是只打开这个是不够的,我们还需要在进行一个操作:
在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”(Mac是Command+Shift+option+/)打开Maintenance选项框,选中并打开 Registry页面
SpringBoot-学习-3-热部署_第2张图片
列表中找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选,用于指 定IDEA工具在程序运行过程中自动编译
SpringBoot-学习-3-热部署_第3张图片
不过这是老版本idea的方式,因为我的idea版本是2021.2.3,我并没有在registry中找到这个配置项
SpringBoot-学习-3-热部署_第4张图片
SpringBoot-学习-3-热部署_第5张图片
查了下2021版本的idea搬到了这里
SpringBoot-学习-3-热部署_第6张图片

3.测试热部署的效果

首先启动项目并访问http://localhost:8080/demo
SpringBoot-学习-3-热部署_第7张图片
可以看到输出没有问题,接下来我们改一下输出的文本(在这之前我们先清空一下控制台)
SpringBoot-学习-3-热部署_第8张图片
刷新一下网页后就会发现,我们并没有重新启动项目,但是输出已经变成了新的效果
SpringBoot-学习-3-热部署_第9张图片
同时我们可以看到控制台重新打印了一些信息
SpringBoot-学习-3-热部署_第10张图片
看起来好像自动重启过了的样子,接下来我们研究一下热部署的原理

三、原理分析

1.官网解释

地址:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools
SpringBoot-学习-3-热部署_第11张图片
从官方文档可以看出:每当类路径上的文件发生更改时,使用spring boot devtools的应用程序就会自动重新启动,也就是我们引入了插件以后,插件会帮我们监控classpath的资源变化,然后进行重启

如果是重启那跟我们手动重启有什么区别呢?
如果重启还是全部重新加载的话不就没有效果了吗?
我们接着看官网介绍:
SpringBoot-学习-3-热部署_第12张图片
这段中我们就可以看到,Spring Boot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方JAR的类)被加载到基本类加载器中。而正在积极开发的类被加载到重启类加载器中。当应用程序重启时,重启类加载器将被丢弃,并创建一个新的类加载器。

这种方法意味着应用程序重启通常比“冷启动”快得多,因为基本类加载器已经可用并已填充。

2.手动验证

我们从上面的官方文档分析中知道如果我们使用了spring-boot-devtools插件的话第三方的类和我们自己编辑的类文件会由不同的类加载器进行加载,那么我们来看一下有插件和没插件的加载的区别

这里我们自己写一个类,让他实现InitializingBean(初始化的时候加载)
我们启动看一下:
没有引入spring-boot-devtools的时候:
SpringBoot-学习-3-热部署_第13张图片
很明显是同一个类加载器
引入spring-boot-devtools的时候再看一下:
SpringBoot-学习-3-热部署_第14张图片
可以看出确实是将正在编辑的类用一个重启类加载器RestartClassLoader进行加载

四、排除资源

我们可能在某些情况下即便更改了某些文件也不需要触发重新启动,这种情况下我们就需要用到排除资源
SpringBoot-学习-3-热部署_第15张图片
从官方文档上可以看到:
某些资源在更改时不一定需要触发重启。例如,Thymeleaf模板可以就地编辑。默认情况下,更改/META-INF/maven、/META-INF/resources、/resources、/static、/public或/templates中的资源不会触发重新启动,但会触发实时重新加载。

如果要自定义这些排除项,可以使用spring.devtools.restart.exclude。例如,要仅排除/static和/public,可以设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

也就是只需要在application.properties文件中加上对应的路径即可


总结

热部署对于大家正常的开发应该是可以起到很大作用的,至少在我看来只要项目是SpringBoot,本地加一个依赖就可以节省大量的重启项目时间,简直太香了

你可能感兴趣的:(SpringBoot,spring,boot,intellij-idea,java)