前置配置 # META-INF/spring.factories文件配置 # ApplicationContextInitializer org.springframework.context.ApplicationContextInitializer=com.test.springbootdemo ...
前置配置
# META-INF/spring.factories文件配置 # ApplicationContextInitializer org.springframework.context.ApplicationContextInitializer=com.test.springbootdemo.eventListeners.MyApplicationContextInitializer # ApplicationListener org.springframework.context.ApplicationListener=com.test.springbootdemo.eventListeners.MyApplicationListener # SpringApplicationRunListener org.springframework.boot.SpringApplicationRunListener=com.test.springbootdemo.eventListeners.MySpringApplicationRunListener
ApplicationContextInitializer介面
代碼示例
public class MyApplicationContextInitializer implements ApplicationContextInitializer { //run方法this.prepareContext觸發 //進一步則是this.applyInitializers //在進一步則是initializer.initialize(context); @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer.....initialize"); } }
說明
1.由於觸發階段在於準備容器的時候,所以添加@Component註解是不會起作用的,應為@Component註解需要在容器刷新時候才會起到作用。
ApplicationListener介面
代碼示例
public class MyApplicationListener implements ApplicationListener { //run方法listeners.starting,觸發第一次 //run方法this.prepareEnvironment,觸發第二次 //即進一步,listeners.environmentPrepared //run方法this.prepareContext,觸發第三次與觸發第四次 //進一步則是listeners.contextPrepared(context);觸發第三次 // listeners.contextLoaded(context);觸發第四次 @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextStartedEvent){ System.out.println("ContextStartedEvent1.....run()"); } System.out.println("Event1.....run()"); } } @Component public class MyApplicationListener2 implements ApplicationListener { //容器refresh()的時候觸發 //進一步finishRefresh(); //再進一步getLifecycleProcessor().onRefresh(); @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextStartedEvent){ System.out.println("ContextStartedEvent2.....run()"); } System.out.println("Event2.....run()"); } }
說明
1.存在兩種註冊方式:
1)@Component註解註冊,這種需要在容器刷新後的finishRefresh()方法裡面觸發,然後監聽到全部事件
2)配置文件註冊,這種會在SpringBoot中開啟listeners,讓listeners準備環境,準備容器等都會觸發。包括容器刷新後的finishRefresh()方法裡面都會觸發【包括了註解修飾的部分】
ApplicationRunner介面
代碼示例
@Component public class MyApplicationRunner implements ApplicationRunner { //run方法this.callRunners,第一次觸發 //進一步,this.callRunner //在進一步,runner.run(args); @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner.....run()"); } }
說明
1.這種只能在容器啟動後進行觸發
2.與CommandLineRunner介面其實並沒有很大差別,都在同一個方法內被調用,調用同一個觸發方法。但是會優於CommandLineRunner被調用。
CommandLineRunner介面
代碼示例
@Component public class MyCommandLineRunner implements CommandLineRunner { //run方法this.callRunners,第一次觸發 //進一步,this.callRunner //在進一步,runner.run(args); @Override public void run(String... args) throws Exception { System.out.println("CommandLineRunner.....run()"); } }
說明
1.這種只能在容器啟動後進行觸發
2.與ApplicationRunner介面其實並沒有很大差別,都在同一個方法內被調用,調用同一個觸發方法。但是會晚於ApplicationRunner被調用。
SpringApplicationRunListener介面
代碼示例
public class MySpringApplicationRunListener implements SpringApplicationRunListener { public MySpringApplicationRunListener(SpringApplication springApplication, String[] arg) { } //run方法listeners.starting觸發 @Override public void starting(ConfigurableBootstrapContext bootstrapContext) { System.out.println("SpringApplicationRunListener.....starting()"); } //run方法this.prepareEnvironment觸發 //進一步listeners.environmentPrepared @Override public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { System.out.println("SpringApplicationRunListener.....environmentPrepared()"); } //run方法this.prepareContext觸發 //進一步listeners.contextPrepared(context); @Override public void contextPrepared(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener.....contextPrepared()"); } //run方法this.prepareContext觸發 //進一步listeners.contextLoaded(context); @Override public void contextLoaded(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener.....contextLoaded()"); } //run方法listeners.started(context, timeTakenToStartup);觸發 @Override public void started(ConfigurableApplicationContext context, Duration timeTaken) { System.out.println("SpringApplicationRunListener.....started()"); } @Override public void started(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener.....started()"); } //run方法listeners.ready(context, timeTakenToReady);觸發 @Override public void ready(ConfigurableApplicationContext context, Duration timeTaken) { System.out.println("SpringApplicationRunListener.....ready()"); } @Override public void running(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener.....running()"); } @Override public void failed(ConfigurableApplicationContext context, Throwable exception) { System.out.println("SpringApplicationRunListener.....failed()"); } }
說明
1.這個比較有意思在容器Refresh()前後都會觸發,包括各種處理環境,準備容器等步驟。