日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

在Spring Boot启动时运行代码

發布時間:2023/12/3 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Spring Boot启动时运行代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring Boot會自動為我們執行很多配置,但是遲早您將不得不做一些自定義工作。 在本文中,您將學習如何進入應用程序引導生命周期并在Spring Boot啟動時執行代碼 。

因此,讓我們看看該框架提供了什么。

1. Bean初始化時執行方法

Spring啟動您的應用程序后,運行某些邏輯的最簡單方法是將代碼作為所選bean引導過程的一部分執行。

你要做什么

只需創建一個類,將其標記為Spring組件,然后將應用程序初始化代碼放入帶有@PostConstruct批注的方法中即可。 從理論上講,您可以使用構造函數代替單獨的方法,但是將對象的構造與其實際職責分開是一種很好的做法。

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

如果您使用應用程序上下文的延遲初始化(例如, 加快Spring Boot的啟動速度 ),則應從此機制中排除具有初始化邏輯的bean。 我已經描述了當整個Spring上下文使用延遲加載時如何使用@Lazy批注快速創建bean 。

您還可以在主Spring Boot應用程序類中使用@PostConstruct批注創建方法。 不要忘記,主類也是由框架管理的組件。

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

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

2. Spring Boot啟動掛鉤

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

與每個Java程序一樣,您可以在輸入應用程序類的static主方法中開始執行此類應用程序。 這就是您可以掛入Spring Boot初始化過程的關鍵所在。

創建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

我不想重復事件的文檔,因此,如果您對事件描述感興趣,就應該檢查一下。 也有ApplicationFailedEvent,但僅在框架無法啟動您的應用程序時才發布。

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

3.在沒有嵌入式Tomcat的情況下啟動時運行代碼

盡管Spring Boot設計人員在創建框架時就考慮了構建胖JAR的問題,但一些開發人員仍將Spring Boot應用程序部署到常規的servlet容器(例如Tomcat)。 如果是這種情況,那么如果沒有其他步驟,上一段中的解決方案將無法工作。

如果將應用程序部署為常規WAR文件 ,則可能已經具有SpringBootServlerInitializator的自定義實現。 您只需稍微擴展它,并在應用程序構建過程中添加初始化鉤子即可。

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

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

結論

簡而言之,在Spring Boot啟動時有兩個主要選項來運行代碼。 最簡單的方法是初始化一個特定的bean。 對于更全球化的情況,該框架具有專用的解決方案,可以使用事件監聽器進入其生命周期。 我們學習了如何實現和設置此類偵聽器。

希望您覺得該帖子對您有所幫助。 您可以在我的Github存儲庫中找到可以正常運行的演示 。 我很高興看到您對需要自定義鉤子的用例的評論。 那應該使閱讀有趣。

翻譯自: https://www.javacodegeeks.com/2018/11/running-code-spring-boot-startup.html

總結

以上是生活随笔為你收集整理的在Spring Boot启动时运行代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。