在项目开发调试过程中,我们会频繁地修改后台类文件,导致需要重新编译、重新启动,整个过程非常麻烦,影响开发效率。Spring Boot 做了很好的支持,提供了spring-boot-devtools组件,使得无须手动重启Spring Boot应用即可重新编译、启动项目,大大缩短编译、启动的时间,从而提高开发效率。

4.1 devtools实现原理

spring-boot-devtools 的核心是两个类加载器(ClassLoader):一个是Base类加载器(Base ClassLoader),负责加载那些不会改变的类,如第三方JAR包等;另一个是Restart类加载器(Restart ClassLoader),负责加载那些正在开发的会改变的类。这样如果只修改Java代码,devtools只会重新加载被修改的类文件,不会重新加载其他第三方的JAR包,所以重启较快,从而达到热部署的效果。

我们在项目中引入devtools组件之后,devtools会监听classpath下的文件变动,当文件被修改时会重新编译,重新生成类文件;devtools监听到类文件变动,触发Restart类加载器重新加载该类,从而实现类文件和属性文件的热部署。

需要注意的是,并不是所有的更改都需要重启应用(如静态资源、视图模板)。我们可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录的修改不用重启应用。例如,可以设置/static和/public下的所有文件更新都不触发应用重启。

4.2 配置开发环境热部署

在pom.xml文件中添加dev-tools依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <!-- optional依赖是否传递 ,设置为true时,表示依赖不会传递 -->
    <optional>true</optional>
</dependency>

在application.properties文件中配置devtools。

# 热部署生效
spring.devtools.restart.enabled=true
# 设置重启的目录
spring.devtools.restart.additional-paths=src/main/java
# classPath 目录下的WEB-INFO文件夹内容修改不重启
spring.devtools.restart.exclude=WEB-INF/**

当前配置主要是打开devtools热部署,然后指定监控的后台文件目录,指明文件变更不需要重新编译部署的目录,配置完成后,devtools会监听classpath下的文件变动,并且会立即重启应用。

devtools也可以实现前台页面热部署,即页面修改后会立即生效,需要在application.properties文件中配置spring.thymeleaf.cache=false,以指定不缓存前端页面。

手动改java文件中的代码。

springboot测试环境和生产环境 springboot生产环境热更新_spring

我这里是将1002改为了1003,发现已经重启。

springboot测试环境和生产环境 springboot生产环境热更新_java_02