用了这么久SpringBoot,这些隐藏技巧你真的掌握了吗?

科技   2024-11-09 07:31   河北  


用了这么久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中,以达到这个目的。


今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码来知识星球找我,我们会尽力为你解答。


AI资源聚合站已经正式上线,该平台不仅仅是一个AI资源聚合站,更是一个为追求知识深度和广度的人们打造的智慧聚集地。通过访问 AI 资源聚合网站 https://ai-ziyuan.techwisdom.cn/,你将进入一个全方位涵盖人工智能和语言模型领域的宝藏库


作者:路条编程(转载请获本公众号授权,并注明作者与出处)

路条编程
路条编程是一个友好的社区,在这里你可以免费学习编程技能,我们旨在激励想学编程的人尝试新的想法和技术,在最短的时间学习到工作中使用到的技术!
 最新文章