欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何在Spring Boot啟動時運行定制的代碼

 更新時間:2018年12月02日 10:44:39   作者:banq  
在本文中您將學(xué)習(xí)如何掛鉤應(yīng)用程序引導(dǎo)程序生命周期并在Spring Boot啟動時執(zhí)行代碼。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Spring Boot會自動為我們做很多配置,但遲早你需要做一些自定義工作。在本文中,您將學(xué)習(xí)如何掛鉤應(yīng)用程序引導(dǎo)程序生命周期并在Spring Boot啟動時執(zhí)行代碼。

1.執(zhí)行bean初始化的方法

Spring啟動應(yīng)用程序后運行某些邏輯的最簡單方法是將代碼作為所選bean引導(dǎo)過程的一部分來執(zhí)行。

只需創(chuàng)建一個類,將其標(biāo)記為Spring組件,并將應(yīng)用程序初始化代碼放在帶有@PostConstruct注釋的方法中。理論上,您可以使用構(gòu)造函數(shù)而不是單獨的方法,但將對象的構(gòu)造與其實際責(zé)任分開是一種很好的做法。

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

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

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

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

2. Spring Boot啟動掛鉤

使用Spring Boot創(chuàng)建的應(yīng)用程序的美妙之處在于,運行它們所需的唯一內(nèi)容是Java Runtime Environment和命令行界面。無需外部工具或應(yīng)用程序。它就像常規(guī)的Java SE程序一樣運行。

作為每個Java程序,您都可以在入口應(yīng)用程序類的靜態(tài)main方法中開始執(zhí)行此類應(yīng)用程序。這就是你可以掛鉤Spring Boot初始化過程的重點。

首先更改main方法中的代碼,以將啟動掛鉤附加到單獨的方法中。您應(yīng)該在應(yīng)用程序啟動之前添加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 …
}

當(dāng)Spring Boot應(yīng)用程序啟動時,它會在引導(dǎo)過程的各個步驟上發(fā)布幾個事件。SpringApplication類的API公開了一個方法,我們可以使用該方法為這些事件添加偵聽器。

這是一個在Spring上下文開始創(chuàng)建bean之前發(fā)布的事件上運行啟動方法的示例:

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

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

以下是按啟動時Spring Boot發(fā)布事件的順序排序的可能事件列表:

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

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

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

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

如果將應(yīng)用程序部署為常規(guī)WAR文件,則可能已經(jīng)擁有SpringBootServlerInitializator的自定義實現(xiàn)。您只需稍微擴(kuò)展它并添加初始化掛鉤作為應(yīng)用程序構(gòu)建過程的一部分。

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

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

結(jié)論

簡而言之,在Spring Boot啟動時運行代碼有兩個主要選項。最簡單的一個設(shè)計用于初始化特定的bean。對于更多全局案例,該框架有一個專用解決方案,可以使用事件偵聽器掛鉤其生命周期。我們學(xué)習(xí)了如何實現(xiàn)和設(shè)置這樣的監(jiān)聽器。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情

    詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情

    這篇文章主要介紹了詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java Filter 過濾器詳細(xì)介紹及實例代碼

    Java Filter 過濾器詳細(xì)介紹及實例代碼

    Filter也稱之為過濾器,它是Servlet技術(shù)中最實用的技術(shù),本文章WEB開發(fā)人員通過Filter技術(shù),對web服務(wù)器管理的所有web資源進(jìn)行攔截,從而實現(xiàn)一些特殊的功能,本文章將向大家介紹Java 中的 Filter 過濾器,需要的朋友可以參考一下
    2016-12-12
  • Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán)示例源碼

    Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán)示例源碼

    這篇文章主要介紹了Spring gateway配置Spring Security實現(xiàn)統(tǒng)一權(quán)限驗證與授權(quán),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Spring實現(xiàn)一個簡單的SpringIOC容器

    Spring實現(xiàn)一個簡單的SpringIOC容器

    本篇文章主要介紹了Spring實現(xiàn)一個簡單的SpringIOC容器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • IDEA?隱藏DEBUG日志的解決方法

    IDEA?隱藏DEBUG日志的解決方法

    IDEA?打印太多的DEBUG日志,看起來很煩,有沒有辦法隱藏日志,網(wǎng)上找了一圈,沒有誰寫的靠譜的,下面小編給大家分享下IDEA?如何隱藏DEBUG日志,需要的朋友可以參考下
    2022-09-09
  • Idea中如何修改項目的SVN地址

    Idea中如何修改項目的SVN地址

    這篇文章主要介紹了Idea中如何修改項目的SVN地址問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    這篇文章主要介紹了RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • SpringBoot快速入門詳解

    SpringBoot快速入門詳解

    springboot提供了一種快速使用spring的方式,基于coc的思想,即約定大于配置,通過本文學(xué)習(xí)快速掌握springboot入門知識,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • SpringBoot中的Controller用法示例詳解

    SpringBoot中的Controller用法示例詳解

    Controller是SpringBoot里最基本的組件,他的作用是把用戶提交來的請求通過對URL的匹配,分配給不同的接收器,再進(jìn)行處理,然后向用戶返回結(jié)果,這篇文章主要介紹了SpringBoot中的Controller用法,需要的朋友可以參考下
    2023-06-06
  • 使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用

    使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用

    這篇文章主要介紹了使用Java開發(fā)實現(xiàn)OAuth安全認(rèn)證的應(yīng)用的方法,OAuth安全認(rèn)證經(jīng)常出現(xiàn)于社交網(wǎng)絡(luò)API應(yīng)用的相關(guān)開發(fā)中,需要的朋友可以參考下
    2015-11-11

最新評論