前置配置
# 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()前后都會觸發,包括各種處理環境,準備容器等步驟,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516311.html
標籤:Java
下一篇:方法的多種呼叫方式
