如何在Spring Boot啓動時運行定製的代碼

在本文中您將學習如何掛鉤應用程序引導程序生命週期並在Spring Boot啓動時執行代碼。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

Spring Boot會自動爲我們做很多配置,但遲早你需要做一些自定義工作。在本文中,您將學習如何掛鉤應用程序引導程序生命週期並在Spring Boot啓動時執行代碼。

1.執行bean初始化的方法

Spring啓動應用程序後運行某些邏輯的最簡單方法是將代碼作爲所選bean引導過程的一部分來執行。

只需創建一個類,將其標記爲Spring組件,並將應用程序初始化代碼放在帶有@PostConstruct註釋的方法中。理論上,您可以使用構造函數而不是單獨的方法,但將對象的構造與其實際責任分開是一種很好的做法。

@Component
class AppInitializator {
 
  private static final Logger log = LoggerFactory.getLogger(AppInitializator.class);
 
  @PostConstruct
  private void init() {
    log.info("AppInitializator initialization logic ...");
    // ...
  }
 
}

還可以在主Spring Boot應用程序類中創建一個帶有@PostConstruct註釋的方法。不要忘記主類也是框架管理的組件。

@SpringBootApplication
public class InitDemoApplication {
 
  // ...
 
  @PostConstruct
  private void init() {
    log.info("InitDemoApplication initialization logic ...");
    // ...
  }
 
}

但這種解決方案感覺就像是一種解決方法而不是真正的解決方案 您可以以非常有限的方式控制Spring框架創建應用程序bean的順序。如果我們想在創建所有bean之前或甚至在框架啓動之前運行初始化邏輯,我們需要找到更好的東西。

2. Spring Boot啓動掛鉤

使用Spring Boot創建的應用程序的美妙之處在於,運行它們所需的唯一內容是Java Runtime Environment和命令行界面。無需外部工具或應用程序。它就像常規的Java SE程序一樣運行。

作爲每個Java程序,您都可以在入口應用程序類的靜態main方法中開始執行此類應用程序。這就是你可以掛鉤Spring Boot初始化過程的重點。

首先更改main方法中的代碼,以將啓動掛鉤附加到單獨的方法中。您應該在應用程序啓動之前添加Spring Boot掛鉤。

public static void main(String[] args) {
  SpringApplication application = new SpringApplication(InitDemoApplication.class);
  addInitHooks(application);
  application.run(args);
}
 
static void addInitHooks(SpringApplication application) {
  // TBD …
}

當Spring Boot應用程序啓動時,它會在引導過程的各個步驟上發佈幾個事件。SpringApplication類的API公開了一個方法,我們可以使用該方法爲這些事件添加偵聽器。

這是一個在Spring上下文開始創建bean之前發佈的事件上運行啓動方法的示例:

static void addInitHooks(SpringApplication application) {
  application.addListeners((ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> {
    String version = event.getEnvironment().getProperty("java.runtime.version");
    log.info("Running with Java {}", version);
  });
}

根據事件類型,Spring傳遞給偵聽器的對象可以讓您訪問幾個有用的操作。在前面的示例中,我們讀取了一些環境屬性,但如果需要,我們也可以修改它。

以下是按啓動時Spring Boot發佈事件的順序排序的可能事件列表:

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationContextInitializedEvent
  • ApplicationPreparedEvent
  • ApplicationStartedEvent
  • ApplicationReadyEvent

根據我的經驗,最重要的事件是ApplicationEnvironmentPreparedEvent。在Spring Boot啓動的這個時刻,尚未創建bean,但您可以訪問整個應用程序配置。通常,這是運行一些自定義啓動代碼的最佳時機。

3.在啓動時但沒有運行Tomcat時運行代碼

儘管Spring Boot設計人員在創建框架時考慮了構建胖JAR,但是一些開發人員仍然將Spring Boot應用程序部署到常規的servlet容器(如Tomcat)。如果是這種情況,那麼前一段中的解決方案將無法發揮作用。除非有增加額外步驟。

如果將應用程序部署爲常規WAR文件,則可能已經擁有SpringBootServlerInitializator的自定義實現。您只需稍微擴展它並添加初始化掛鉤作爲應用程序構建過程的一部分。

您可以輕鬆地重用我們在主應用程序類中創建的addInitHooks()方法。

public class InitDemoWarInitializer extends SpringBootServletInitializer {
 
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    InitDemoApplication.addInitHooks(builder.application());
    return builder.sources(InitDemoApplication.class);
  }
 
}

結論

簡而言之,在Spring Boot啓動時運行代碼有兩個主要選項。最簡單的一個設計用於初始化特定的bean。對於更多全局案例,該框架有一個專用解決方案,可以使用事件偵聽器掛鉤其生命週期。我們學習瞭如何實現和設置這樣的監聽器。

在Github存儲庫中找到完全可用的演示

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章