spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。接下来我们就通过编码的方式实现springboot热部署。
一)新建应用&添加依赖
新建项目之后,除了添加springboot基础依赖之外,还要添加spring-boot-devtools:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
二)修改ide配置&浏览器缓存禁用
为了实现热部署,ide要支持自动编译,并且验证的时候要禁用浏览器缓存(否则看不到变更后内容)。
1.修改idea配置
在idea中打开File->Settings->Compile,勾选Build project automatically:
使用快捷键Ctrl+Shift+Alt+/,选择Registry,然后勾选Compiler autoMake allow when app running:
这样我们就在服务端启用了在应用运行期间自动编译和构建。
2.禁用浏览器缓存
本例中我们使用chrome测试,如果不禁用缓存,后端应用动态部署后前端请求可能看不到变更和新增内容,点击F12或者Ctrl+Shift+i后,在network选项中勾选Disable cache:
三)编码&测试
编写一个简单的Controller:
@RestController
public class IndexController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
启动应用后浏览器输入http://localhost:8080/hello:
应用启动没有问题并且能够接收和处理请求。修改Controller增加如下内容:
@GetMapping("/name")
public String name() {
return "my name is shuya";
}
保存后发现应用自动重新编译启动,浏览器输入http://localhost:8080/name:
请求能够被正常的接收和处理,也就是说明我们配置的springboot热部署已经生效。
总结
springboot热部署在开发阶段特别实用,我们对应用修改之后不需要手动点构建和部署就能自动重启后看到效果,当然可能springboot实现热部署还有其他方式,这里暂不做过多探讨,有兴趣的可以自己研究一下。
本文分享自 PersistentCoder 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有