SpringBoot 三大开发工具,你都用过么?
# 前言
平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效。如果你的应用足够大的话,启动可能需要好几分钟。有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款SpringBoot官方的热部署工具spring-boot-devtools
,修改完代码后可快速自动重启应用!
# 何为热部署?
热部署指在应用程序运行过程中,对其进行修改后,无需停止和重启应用程序即可使修改生效。也就是说,程序可以在运行状态下进行更新或者重新部署。
# 热部署有啥弊端?
热部署的弊端主要有以下几点:
- 可能会增加系统复杂性。使用热部署需要特定的技术和工具支持,这可能会增加系统的复杂性。
- 可能会导致内存溢出等问题。在热部署过程中,旧的应用程序和新的应用程序会同时存在于系统中,可能会导致内存等资源的消耗过大,从而出现性能问题或者内存溢出等错误。
- 热部署可能会导致应用程序状态丢失。在热部署过程中,应用程序的状态可能会丢失,需要特殊的处理方式来保证状态的正确性。
# 常见的热部署方式
以下是几种常见的Spring Boot热部署方式:
- 使用Spring Loaded:Spring Loaded是一个开源的JVM热部署解决方案,可以在应用程序运行时重新加载类文件。可以通过在应用程序的类路径中添加Spring Loaded的JAR文件来使用它。
- 使用DevTools:Spring Boot DevTools是一个可选的模块,它提供了很多有用的开发工具,包括热部署。可以通过将“spring-boot-devtools”模块作为依赖项添加到项目中来使用它。
- 使用JRebel:JRebel是一种Java热部署工具,可以在应用程序运行时重新加载类文件和资源文件。可以将JRebel插件添加到开发环境中,然后在应用程序启动时启用JRebel。
- 使用DCEVM和HotSwapAgent:DCEVM是一个可以替换Java虚拟机(JVM)的修改版JVM,可以支持类热部署。HotSwapAgent是一个开源的热部署解决方案,可以与DCEVM一起使用,以在应用程序运行时重新加载类文件。
需要注意的是,这些热部署工具都有其自身的限制和局限性。在使用这些工具时,需要谨慎考虑其适用性和影响范围。
# spring-boot-devtools简介
SpringBoot官方开发工具,如果你的应用集成了它,即可实现热部署和远程调试。
# 实现原理
使用该工具应用为什么启动更快了?主要是因为它使用了两种不同的类加载器。基础类加载器用于加载不会改变的类(比如第三方库中的类),重启类加载器用于加载你应用程序中的类。当应用程序启动时,重启类加载器中的类将会被替换掉,这就意味着重启将比冷启动更快!
# 热部署
接下来我们将集成devtools,来演示下热部署功能。
- 添加devtools的依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2
3
4
5
- 由于在项目构建时,devtools才会自动重启项目,而IDEA默认并没有使用自动构建,此时我们可以修改应用启动配置,设置当IDEA失去焦点时自动构建项目;
这样我们就可以在修改后自动重启应用程序并重新加载修改后的页面和资源了。
# 演示代码
以下是一个简单的演示代码,用于演示如何使用Spring Boot和Spring DevTools实现自动热部署。
# pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
8
9
10
11
# Application.java
@SpringBootApplication
@RestController
public class Application {
@GetMapping("/")
public String index() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# index.html
<!DOCTYPE html>
<html>
<head>
<title>Spring Boot Demo</title>
</head>
<body>
<h1>Welcome to Spring Boot</h1>
<p>This is a demo page for Spring Boot DevTools</p>
</body>
</html>
2
3
4
5
6
7
8
9
10
# 最终效果
运行应用程序后,在浏览器中访问http://localhost:8080/,会显示“Hello World!”,然后修改index.html中的内容,保存文件,应用程序会自动重启并加载修改后的页面。
这里你们大可进行修改演示,从而避免了修改代码导致的项目重启等繁琐步骤,还是很好用的。
# 测试用例
我们可以通过下面的测试用例来测试应用程序是否正确地实现了自动热部署。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
class ApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
void contextLoads() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World!"));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
测试用例中模拟了一个HTTP GET请求,访问根路径“/”,并检查响应是否包含“Hello World!”文本。如果测试用例执行成功,则说明自动热部署功能已经正确地实现了。
# 小结
本文介绍了如何使用Spring Boot和Spring DevTools实现自动热部署,提高Java开发阶段的生产力。我们可以通过自动重启应用程序、自动重新加载修改后的页面和资源等功能,实现自动化地重新部署应用程序。