系列文章
目录
前言
前面对SpringBoot热部署的流程和使用方式做了一个简单的介绍,这里对SpringBoot热部署原理做一个分析以及它的好处
原理
- (官网描述)spring-boot-devtools 这个插件监视本地的代码路径信息,只要有更新,就会触发重启
- 重启的过程通过两个不同的类加载器来区分,一个是基本的 ClassLoader ,另一个是 RestartClassLoader, ClassLoader(实际上是子类 AppClassLoader ) 主要是用于第三方等jar的加载,RestartClassLoader 主要是用于本地代码类的加载,这个 RestartClassLoader 就是 spring-boot-devtools 引入的类加载器
实践
针对上面官网的介绍,来实操一下,验证热部署是否是这样工作的呢
更新代码触发重启
- 要测试热部署下的启动模式,就需要在启动的过程干事儿,这里先应用@PostConstruct 注解
// 让当前类被扫描到
@Component
public class MyConfig {
//类的生命周期中干事情
@PostConstruct
public void config() {
System.out.println("修改前");
}
}
- 启动项目,记录当前的类Class修改时间
- 修改文字 修改前—> 修改后,再观察当前类Class的修改时间
-
当前类被重新编译,控制台不久输出重启日志,验证成功
类加载器的不同
- 多点代码,打印出不同的类(主要是本地和第三方)的类加载器
// 让当前类被扫描到
@Component
public class MyConfig {
//类的生命周期中干事情
@PostConstruct
public void config() {
System.out.println("修改前");
System.out.println("Local "+MyConfig.class.getClassLoader());
System.out.println("Other "+ DispatcherServlet.class.getClassLoader());
}
}
- 启动项目,查看日志输出
- 通过日志能发现,本地的是 RestartClassLoader,第三方的是ClassLoader的子类 AppClassLoader,说明热部署下的类加载器的不同
其他
其实深入一点儿的话,还可以看看热部署的实现原理,例如:热部署是怎样监听到文件更新而重启