springboot啟動過程中常用的回撥

大明發表於2022-01-09

1.介紹

springboot提供非常豐富回撥介面,利用這些介面可以做非常多的事情,對於一些常用的回撥介面進行介紹

2.常用的擴充介面

1.ApplicationContextInitializer
2.ApplicationListener
3.ApplicationRunner
4.CommandLineRunner

3.例項:

1.ApplicationContextInitializer介面是在spring容器初初始化之前呼叫的

建立MyApplicationContextInitializer類實現ApplicationContextInitializer介面

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("MyApplicationContextInitializer啟動。。。。。。。。。。");
    }
}

因為該介面在容器初始化之前所以註解是沒有用的,在mian方法中初始化MyApplicationContextInitializer

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(Application.class);
        springApplication.addInitializers(new MyApplicationContextInitializer());
        springApplication.run(args);
        //SpringApplication.run(Application.class, args);
    }
}

2.ApplicationListener監聽器,這個介面可以根據不同的事件進行不同的觸發條件

spring容器內建觸發事件:

  • ContextRefreshedEvent:初始化或重新整理ApplicationContext時引發的事件
  • ContextStartedEvent:ApplicationContext啟動時引發的事件
  • ContextStoppedEvent:ApplicationContext停止時引發的事件
  • ContextClosedEvent:ApplicationContext關閉時引發的事件

程式碼示例:

@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("MyApplicationListener。。。。。。。。。。");
    }
}

注意:spring也有ApplicationEvent介面可以自定義事件

3.ApplicationRunner觸發時機在容器載入完之後

@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("MyApplicationRunner。。。。。。。。。。");
    }

}

原始碼:

/**
 *用於指示 bean 包含在SpringApplication時應該執行的SpringApplication
 *多個ApplicationRunner bean 可以在同一個應用程式上下文中定義,並且可以使用Ordered介面或@Order註釋進行排序。
 */
public interface ApplicationRunner {

	/**
	 * 傳入的應用程式引數
	 */
	void run(ApplicationArguments args) throws Exception;

}

4.CommandLineRunner

功能基本與ApplicationRunner一致,區別在於,介面的引數型別,這裡傳遞的是原始String 陣列,擴充性ApplicationRunner會更好一點

@Component
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("MyCommandLineRunner。。。。。。。。。。");
    }

}

4.其他擴充介面:

1.InstantiationAwareBeanPostProcessor

新增例項化前回撥的BeanPostProcessor子介面,以及例項化後但在設定顯式屬性或發生自動裝配之前的回撥。
通常用於抑制特定目標 bean 的預設例項化,例如建立具有特殊 TargetSources 的代理(池目標、延遲初始化目標等),或實現其他注入策略,如欄位注入。
注意:此介面為專用介面,主要供框架內部使用。 建議儘可能實現普通的BeanPostProcessor介面,或者從InstantiationAwareBeanPostProcessorAdapter派生,以遮蔽對該介面的擴充套件。

2.SmartInstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor介面的擴充套件,新增了用於預測已處理 bean 的最終型別的回撥。
注意:此介面為專用介面,主要供框架內部使用。 通常,應用程式提供的後處理器應該簡單地實現普通的BeanPostProcessor介面或派生自InstantiationAwareBeanPostProcessorAdapter類。

感謝各位小夥伴閱讀到最後,如有錯誤,敬請指正。

相關文章