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 开启热部署的操作步骤
- 设置
![image]()
- 设置
![image]()
Jrebel
因为使用 springboot-devtools 方式的热部署存有以下限制,所以在实际的开发实践中我们常使用 Jrebel :
- 额外引入的依赖实际上生产环境并不需要,开发者引入后容易误提交到线上
- 存在功能上有限制,比如在方法内的修改可以实现热部署,但是新增的方法或者修改方法参数之后热部署是不生效的
- 相对于 JRebel ,springboot-devtools 方式热部署的速度可能有点慢



浙公网安备 33010602011771号