开发过程中我可能经常会因为修改一点点代码就需要重启项目而烦恼,这样不仅很繁琐,还会因为不断重启浪费大量的时间,无法提高工作效率。可是现在SpringBoot为我们提供了非常简单的方式让我们实现热部署。
一、添加相关依赖
<!-- 热部署依赖 start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- <optional>true</optional> --><!-- 该属性网上很多文章说必须为true,经验证可以不用 -->
<scope>true</scope>
</dependency>
<!-- 热部署依赖 end -->
二、新增一个文件
import java.util.List;
import com.somta.springboot.pojo.User;
public interface UserDao {
int addUser(User user);
int deleteUserById(Long id);
int updateUserById(User user);
User queryUserById(Long id);
List<User> queryUserList();
}
启动项目,任意修改一段代码,保存代码,会发现系统自动重启了,如此简单就可以达到热部署了。
三、静态资源实现热部署
后台java代码通过上面的配置已经轻松实现了热部署,下面我们说说SpringBoot的静态资源的热部署,默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启的。
在yml文件中添加如下配置,分别指定需要重启的文件夹和不需要重启的文件夹(测试发现除了排除的文件夹,其他文件夹修改都会触发重启,spring.devtools.restart.enabled=true 该属性可以快速启用和禁止热部署)
spring:
devtools:
restart:
enabled: true
#添加那个目录的文件需要restart
additional-paths: src/main/java
#排除那个目录的文件不需要restart
exclude: static/**
四、热部署原理分析
1)SpringBoot内置了两个加载器,一个Base ClassLoader加载器,用于加载不会改变的第三方依赖的jar;另一个Restart ClassLoader加载器,用于加载自己编写的类;
2)执行流程:当应用重启后,原先的Restart ClassLoader被丢掉、重新new一个Restart ClassLoader来加载这些修改过的东西,而Base ClassLoader却没有变化。这就是devtools重启速度快的原因。
Git代码地址:https://gitee.com/Somta/SpringBoot/tree/master/SpringBoot-hotDeploy
原文地址:http://somta.com.cn/#/blog/view/5da584874c534964866aa099e41f3b43
本文由明天的地平线创作,如想了解更多更详细的内容,请关注一下公众号,公众号内将进行最新最实时的更新!