2017-08-30 72 views
1

在什麼情況下,首選CommandLineRunner,而不是在SpringBoot應用程序的主要方法中編寫其他代碼。SpringBoot CommandLineRunner

我知道CommandLineRunner在main完成之前得到執行。

回答

1

我用它來解耦代碼。 CommandLineRunner不是將大量代碼放入主方法中,而是讓您在代碼庫中更均勻地分發它。這實際上取決於你傳遞什麼樣的標誌以及爲什麼需要傳遞它們.Spring爲你以最簡單的方式完成工作提供了很大的靈活性。

對於完整的命令行工具,可以通過在初始化和核心行爲之間分割代碼來分離初始化和配置一點點。

Spring引導服務器可以根據從命令行傳入的參數來覆蓋配置。

0

我還沒有找到任何好的理由來使用它,而不是在啓動應用程序後編寫代碼。
我能想到的唯一的事情是在調用任何SpringApplicationRunListener s調用#finished之前調用命令行參賽者。

我看到有人用它們來執行主應用程序邏輯,但我認爲這是一個反模式。
這樣做很煩人的事情之一是,應用程序啓動計時器仍在運行,當任務完成時,您將看到類似Started DemoApplication in 5.626 seconds (JVM running for 0.968)的日誌條目。
儘管實際上它剛剛完成,但看到有關您的應用程序的消息很讓人困惑。

0

我遇到了一個場景,在第一次從控制器端點命中方法之前,我必須保存從裝入緩存的數據庫中的某些數據。在這種情況下,需要在擴展CommandLineRunner類之後使用run方法來填充緩存,以便在應用程序啓動之前緩存中的數據已經可用。

1

在簡單情況下,沒有區別。

但是,如果代碼需要訪問spring提供的功能,例如ioc或僅接口存儲庫/服務,則需要等待完整的應用程序啓動。並且在完成之後重寫運行方法的調用是保證的。

此外,CommandLineRunner具有其他優點:

  • 可以實現多次
  • 啓動任何調度程序或記錄任何消息應用程序開始運行前的能力