Spring Boot DevTools

Spring Boot DevTools 为 Spring 开发人员提供了一些便利的开发期工具,其中包括:

  • 代码变更后应用会自动重启
  • 当面向浏览器的资源(如模版、JavaScript 、样式表)等发生变化时,会自动刷新浏览器
  • 自动禁用模版缓存
  • 如果使用 H2 数据库的话,内置了 H2 控制台

应用自动重启

如果将 DevTools 作为项目的一部分,那么你可以看到,当对项目中的 Java 代码和属性文件做出修改后,这些变更稍后就能发挥作用。DevTools 会监控变更,当它看到有变化的时候,将会自动重启应用。
更准确的说,当 DevTools 运行的时候,应用程序会被加载到 JVM 两个独立的类加载器中。其中一个类加载器会加载你的 Java 代码、属性文件以及项目中“src/main/”路径下几乎所有的内容。这些条目很可能会经常发生变化。另外一个类加载器会加载依赖的库,这些库不太可能经常发生变化。
当探测到变更的时候,DevTools 只会重新加载包含项目代码的类加载器,并重启 Spring 的应用上下文,在这个过程中另外一个类加载器和 JVM 会原封不动。这个策略非常精细,但是它能减少应用启动时间。
这种策略的一个不足之处就是自动重启无法反映依赖项的变化。这是因为包含依赖库的类加载器不会自动重新加载。这意味着每当我们在构建规范中添加、变更或移除依赖的时候,为了让变更生效,我们需要重新启动应用。

浏览器自动刷新和禁用模版缓存

默认情况下,像 Thymeleaf 和 FreeMarker 这样的模版方案在配置时会缓存模版解析的结果。这样的话,在为每个请求提供服务的时候,模版就不用重新解析了。在生产环境中,这是一种很好的方式,因为它会带来一定的性能收益。
但是,在开发期,缓存模版就不太好了。在应用运行的时候,如果缓存模版,那么我们刷新浏览器就无法看到模版变更的效果了。即便我们对模版做了修改,在应用重启之前,缓存的模版依然会有效。
DevTools 通过禁用所有模版缓存解决了这个问题。你可以对模版进行任意数量的修改,只需要刷新一下浏览器就能看到结果。
如果你像我这样,连浏览器的刷新按钮都懒得点,那么对代码做出变更之后,马上在浏览器中看到结果就好了。幸运的是,DevTools 有一些特殊的功能可以供我们使用。
DevTools 在运行的时候,它会和你的应用程序一起,同时自动启动一个 LiveReload 服务器。LiveReload 服务器本身并没有太大的用处。但是,当它与 LiveReload 浏览器插件结合起来的时候,就能够在模版、图片、样式表、JavaScript 等(实际上,几乎涵盖为浏览器提供服务的所有内容)发生变化的时候自动刷新浏览器。
请访问 LiveReload 官网,以了解如何为你的浏览器安装 LiveReload 插件。

内置的 H2 控制台

如果你使用 H2 数据库进行开发,DevTools 将会自动启用 H2 。这样的话,我们可以通过 Web 浏览器进行访问。你只需要让浏览器访问 http://localhost:8080/h2-console ,就能看到应用所使用的数据。

IDEA 开启热部署的操作步骤

  1. 设置
    image
  2. 设置
    image

Jrebel

因为使用 springboot-devtools 方式的热部署存有以下限制,所以在实际的开发实践中我们常使用 Jrebel :

  • 额外引入的依赖实际上生产环境并不需要,开发者引入后容易误提交到线上
  • 存在功能上有限制,比如在方法内的修改可以实现热部署,但是新增的方法或者修改方法参数之后热部署是不生效的
  • 相对于 JRebel ,springboot-devtools 方式热部署的速度可能有点慢
posted @ 2023-06-01 19:25  HopeLive  阅读(222)  评论(0)    收藏  举报