📑前言
本文主要SpringBoot通过DevTools实现热部署的文章,如果有什么需要改进的地方还请大佬指出⛺️
🎬作者简介:大家好,我是青衿🥇
☁️博客首页:CSDN主页放风讲故事
🌄每日一句:努力一点,优秀一点
目录
文章目录
- 📑前言
- **目录**
-
- 为什么要使用热部署
- 可选的热部署插件
- Spring Boot Devtools 是什么?
- 1、添加DevTools依赖在pom.xml中
- 2、编辑application.yml配置文件
- 3、IDEA的相关设置
-
- 4.4 测试
- 📑文章末尾
为什么要使用热部署
在没有使用热部署的情况下,一个稍微大点的项目启动就要七八秒甚至十几秒的启动时间,当然这取决于你的机器性能,不过毫无疑问,不管你的机器性能如何强大,也耗不过日益增长的项目体量,所以迫切需要无需重新启动项目也能将代码的增加修改同步到服务器的手段。
可选的热部署插件
在Spring Boot项目中,Spring Boot官方提供你了Devtools热部署模块,通过maven的方式导入就能使用。根据官方描述,Spring Boot Devtools插件使用了两种类加载器来加载资源:对于第三方的jar包使用base classloader来加载,这类资源一般比较固定,不会发生改动;而对于项目中的经常需要变动的代码类则使用restart classloader来加载。
Spring Boot Devtools 是什么?
顾名思义,DevTools为Spring开发人员提供了一些便利的开发期工具,其中包括:
代码变更后应用会自动重启;
当面向浏览器的资源(如模板、JavaScript、样式表)等发生变化时,会自动刷新浏览器;
自动禁用模板缓存;
在项目的开发中,当每次修改了后台代码后都需要重启服务,这样降低了开发效率。下面将介绍在SpringBoot项目中使用DevTools实现[热部署]
spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
1、添加DevTools依赖在pom.xml中
pom.xml文件的配置
!-- 热部署相关依赖,布置到线上的时候要去掉! -->
dependency>
groupId>org.springframework.boot/groupId>
artifactId>spring-boot-devtools/artifactId>
optional>true/optional>
scope>runtime/scope>
/dependency>
依赖的取值为runtime,表示该依赖只在运行时生效,不会被打包到最终的可执行文件中。这意味着该依赖只在开发过程中起作用,不会影响到生产环境。
2、编辑application.yml配置文件
在application.yml配置文件中添加相关配置信息。
spring:
devtools:
restart:
enabled: true #设置开启热部署
additional-paths: src/main/java #重启目录
这样配置后,当你修改了Java代码文件(位于src/main/java目录下)时,应用程序会自动重启。
3、IDEA的相关设置
(1)菜单:File → Settings → Build, Execution, Deployment → Compiler
在右侧的选项中找到 Build project automatically 选项并勾选,如下图:
(2)快捷键 Ctrl + Shift + Alt + / ,点击Registry项。
然后找到 compiler.automake.allow.when.app.running 选项并勾选,如下图:
4.4 测试
public ResponseResult login(@RequestBody User user){
System.out.println("无自动部署");
System.out.println("无自动部署");
System.out.println("无自动部署");
...
}
控制台输出
修改字段
public ResponseResult login(@RequestBody User user){
System.out.println("自动部署");
System.out.println("自动部署");
System.out.println("自动部署");
...
}
几秒后控制台自动运行
以上是springboot使用devtools的示例,可以根据自己的实际需求进行调整。