用了這麼久SpringBoot卻還不知道的一個小技巧

2023-09-01 09:00:18

前言

你可能調第三方介面喜歡啟動application,修改,再啟動,再修改,順便還有個不喜歡寫JUnitTest的習慣。

你可能有一天想要在SpringBoot啟動後,立馬想要幹一些事情,現在沒有可能是你還沒遇到。

那麼SpringBoot本身提供了一個小技巧,很多人估計沒用過。

正文

1、效果

廢話不多說,先寫個service和controller展示個效果最實在。

來個簡單的service

@Service
public class TestService {

   public String test() {

      System.err.println("Hello,Java Body ~");
      return "Hello,Java Body ~";
   }
}

再來個簡單的controller

@RestController
@RequestMapping("/api")
@AllArgsConstructor
public class TestController {

   private final TestService testService;

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

接下來是不是以為要啟動調介面了,No,在SpringBoot的啟動類中加這麼個玩意兒

@SpringBootApplication
public class JavaAboutApplication {

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

   @Bean
   CommandLineRunner 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,今天學會一個新知識點了不,可以自己下去試試哦。


持續分享各種經驗,持續輸出乾貨,喜歡記得點贊+關注哦~