9.SpringBoot 热部署(自动重启)
在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。下面我=我们就看看对于简单的类修改的热部署怎么实现。
9.1 SpringBoot 启动 banner 修改
1.在 yml 编写配置
spring:banner:location: banner.txt
2.编写 banner.txt
.::::..::::::::.:::::::::::..:::::::::::''::::::::::::'.::::::::::'::::::::::::::....::::::::::::.``::::::::::::::::::::``:::::::::' .:::.::::' ':::::' .::::::::..::::' :::: .:::::::'::::..:::' ::::: .:::::::::' ':::::..::' :::::.:::::::::' ':::::..::' ::::::::::::::' ``::::....::: ::::::::::::' ``::.````':. ':::::::::' ::::..'.:::::' ':'````..
9.2 SpringBoot 热部署
1.导入依赖
<!-- 热部署依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>
</dependency>
2.编写配置
spring:devtools:restart:enabled: trueadditional-paths: src/main/java
3.修改 Idea 设置
1
2
4.测试
- 重启服务器
- 修改源代码
- 切到浏览器,查看效果
- 再切回 idea,看控制台
9.3 自动重启原理
SpringBoot提供的重启技术是通过两个“类的加载(ClassLoader)”来实现的。不会更改的类(如第三方 jar 包),被加载到 BaseClassLoader 中,会更改的被加载到 Restart ClassLoader 中。再热部署时BaseClassLoader 不会被重新加载,Restart ClassLoader会被重新加载(删除然后再重新创建)
9.4 排除自动启动资源
有些资源更改后其实是不需要触发重新启动的。比如 thymeleaf,可以再 yml 配置文件下配置一下信息
spring:devtools:restart:additional-exclude: static/**, public/**, templates/**