springboot啟動過程中常用的回調
- 2022 年 1 月 9 日
- 筆記
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類。