用了这么久SpringBoot,这些隐藏技巧你真的掌握了吗?
在日常开发中,许多开发者可能习惯于启动应用程序,进行一些调整后重启,再次修改,尤其是在对接第三方API时,这种反复调试的流程非常常见。然而,往往忽略了通过编写单元测试来提高开发效率和代码稳定性。
有时候,你可能需要在 SpringBoot 启动后立即执行某些特定的操作,例如初始化数据库、加载配置文件或预热缓存。尽管这类需求在开发初期不常见,但随着项目复杂度增加,执行一些启动后的操作可能变得至关重要。
为了应对这些场景,SpringBoot提供了一个便捷的机制——CommandLineRunner
接口。这个小技巧能够帮助你在应用启动后立即执行代码,而无需额外的配置或复杂的流程。许多开发者可能还没有深入了解这一功能,但它在实际开发中非常实用。
通过使用CommandLineRunner
,你可以在SpringBoot启动后完成各种任务,比如调试接口、初始化服务、预加载数据等,显著提升开发效率。这不仅仅是一个调试工具,更是一个应对复杂项目需求的重要手段。
效果展示
不多说,先写一个服务类和控制器,来展示这个小技巧的实际效果。
这是一个简单的服务类:
@Service
public class TestService {
public String test() {
System.err.println("Hello,Java Body ~");
return "Hello,Java Body ~";
}
}
然后,创建一个简单的控制器:
@RestController
@RequestMapping("/api")
@AllArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping("/test")
public ResponseEntity test() {
return ResponseEntity.ok().body(testService.test());
}
}
接下来,你可能会认为是时候启动并调用API了吧?其实不然,还需要在SpringBoot启动类中加一点小技巧。
@SpringBootApplication
public class JavaAboutApplication {
public static void main(String[] args) {
SpringApplication.run(JavaAboutApplication.class, args);
}
@Bean
CommandLineRunner lookupTestService(TestService testService) {
return args -> {
// 1、测试接口
testService.test();
};
}
}
启动并查看效果:
你会发现,SpringBoot启动后,它会自动加载并执行服务的test方法。
这个小例子想说明什么?其实它要展示的是CommandLineRunner
。
介绍
CommandLineRunner
是一个接口,用于在Spring Boot应用程序启动后执行一些特定的任务或代码块。当应用程序完成启动后,Spring Boot会查找并执行所有实现了CommandLineRunner
接口的bean。
简单来说,就是如果你想在SpringBoot启动后立即执行某些操作,你可以将其写在这里。
曾经如何使用它
在我的案例中,我曾与许多供应商对接。在早期阶段,我不会立即开始编写业务逻辑,而是首先确保接口工作正常,然后再将其集成到业务中。
例如,对于像webservice这样的接口,我曾使用CommandLineRunner
直接调用对方的接口进行测试。这种方式非常方便,也节省了IDEA的资源。不过,在调试完成后,记得注释掉该代码,只在本地测试时再打开。
其他用途
除了调试第三方接口之外,CommandLineRunner
还能用于哪些场景呢?
正如在开头提到的,它适用于任何你想在SpringBoot启动后立即执行的操作,所以可以充分发挥你的想象力。
这里提供几个参考思路:
1) 数据库初始化
你可以使用CommandLineRunner
在应用启动时执行数据库初始化操作,例如创建表或插入初始数据。
2) 缓存预热
CommandLineRunner
可以在应用启动后预热缓存,将常用数据加载到缓存中,从而提高应用的响应速度。
3) 加载外部资源
加载一些外部资源,例如配置文件、静态文件或其他资源。CommandLineRunner
可以帮助你在启动时读取这些资源并进行相应处理。
4) 任务初始化
使用CommandLineRunner
初始化并配置一些定时任务,确保它们在应用启动后立即开始运行。
5) 日志记录
在SpringBoot启动后记录一些必要的信息,例如应用版本、环境配置,甚至是启动时间,具体根据需求来决定。
6) 组件初始化
你可能需要按特定顺序初始化一些组件,CommandLineRunner
可以帮助你控制初始化顺序。只需将它们添加到不同的CommandLineRunner
实现类中,并使用@Order
注解来指定它们的执行顺序。
结论
实际上,CommandLineRunner
有很多可能的用途。再举一个例子,当启动 netty 时,它通常会绑定一个端口并以同步的方式启动。
但如果我们想将它与 SpringBoot 集成,就不能继续这样做了。相反,我们让 SpringBoot 控制 netty 的启动和关闭。当 SpringBoot 启动时,netty 也随之启动;当 SpringBoot 关闭时,netty 自然也会关闭,这样更加优雅。
因此,我们可以将 netty 的启动执行器放入CommandLineRunner
中,以达到这个目的。