写点什么

用了这么久 SpringBoot 却还不知道的一个小技巧

作者:java易二三
  • 2023-09-01
    湖南
  • 本文字数:1546 字

    阅读完需:约 5 分钟

前言


你可能调第三方接口喜欢启动 application,修改,再启动,再修改,顺便还有个不喜欢写 JUnitTest 的习惯。


你可能有一天想要在 SpringBoot 启动后,立马想要干一些事情,现在没有可能是你还没遇到。


那么 SpringBoot 本身提供了一个小技巧,很多人估计没用过。


正文 1、效果


废话不多说,先写个 service 和 controller 展示个效果最实在。


来个简单的 service


java 复制代码 @Servicepublic class TestService {


public String test() {


  System.err.println("Hello,Java Body ~");  return "Hello,Java Body ~";
复制代码


}}


再来个简单的 controller


java 复制代码 @RestController@RequestMapping("/api")@AllArgsConstructorpublic class TestController {


private final TestService testService;


@GetMapping("/test")public ResponseEntity test() {return ResponseEntity.ok().body(testService.test());}}


接下来是不是以为要启动调接口了,No,在 SpringBoot 的启动类中加这么个玩意儿


java 复制代码 @SpringBootApplicationpublic class JavaAboutApplication {


public static void main(String[] args) {    SpringApplication.run(JavaAboutApplication.class, args);}
复制代码


@BeanCommandLineRunner lookupTestService(TestService testService) {return args -> {


     // 1、test接口     testService.test();
};
复制代码


}


}


启动看下效果


可以发现,SpringBoot 启动后,自动加载了 service 的执行程序。


这个小案例是想说明什么呢,其实就是 CommandLineRunner 这么个东西。


2、它是什么


CommandLineRunner 是一个接口,用于在 Spring Boot 应用程序启动后执行一些特定的任务或代码块。当应用程序启动完成后,Spring Boot 会查找并执行实现了 CommandLineRunner 接口的 Bean。


说白了,就是 SpringBoot 启动后,我立马想干的事,都可以往里写。


3、我用它做过什么


我的话,和很多厂家对接过接口,在前期不会直接开始写业务,而是先调通接口,再接入业务中。


比如 webservice 这种,我曾经使用 CommandLineRunner 直接调对方接口来测试,还挺舒适,也节省了 IDEA 资源,但要注意调试完成后注释掉,本地测试的时候再打开就行。


4、它还有哪些用途


除了可以拿来调试第三方接口,它还有什么用途吗?


其实开头已经说过,它就是 SpringBoot 启动后,你立马想干的事,都可以在里面写,所以你完全可以发挥想象去用。


我这里,提供几个思路作为参考。


1)、数据库初始化


你可以使用 CommandLineRunner 来执行应用程序启动时的数据库初始化操作,例如创建表格、插入初始数据等。


2)、缓存预热


CommandLineRunner 在应用程序启动后预热缓存,加载常用的数据到缓存中,提高应用程序的响应速度。


3)、加载外部资源


加载一些外部资源,例如配置文件、静态文件或其他资源。CommandLineRunner 可以帮助你在启动时读取这些资源并进行相应的处理。


4)、任务初始化


使用 CommandLineRunner 来初始化和配置某些定时任务,确保它们在应用程序启动后立即开始运行。


5)、日志记录


SpringBoot 启动后记录一些必要的日志信息,如应用程序版本、环境配置、甚至启动时间等等,这个看具体需求。


6)、组件初始化


你可能需要按照特定的顺序初始化一些组件,CommandLineRunner 可以帮助你控制初始化顺序,只需要将它们添加到不同的 CommandLineRunner 实现类中,并使用 @Order 注解指定它们的执行顺序即可。


总结


其实,能用的地方挺多,我最后再举个例子,netty 启动时,往往是绑定了端口并以同步形式启动。


但如果要和 SpringBoot 整合,我们不可能还那么做,而是交给 SpringBoot 来控制 netty 的启动和关闭,当 SpringBoot 启动后,netty 启动,当 SpringBoot 关闭时,netty 自然也关闭了,这样才比较优雅。


那么,我们完全可以将 netty 的启动执行程序放到 CommandLineRunner 中,这样就可以达到目的了。


没用过的 xdm,今天学会一个新知识点了不,可以自己下去试试哦。

用户头像

java易二三

关注

还未添加个人签名 2021-11-23 加入

还未添加个人简介

评论

发布
暂无评论
用了这么久SpringBoot却还不知道的一个小技巧_Java_java易二三_InfoQ写作社区