Spring BootのApplicationEventの一覧とタイミングを調べた

Spring BootにはSpirngApplicationのライフサイクルにしたがったApplicationEventが定義されているが、調べていてそれらの情報があまり出てこなかったので調べてみた。

Spring Boot の ApplicationEvent一覧

ApplicationStartingEvent実行開始時。listenerの登録やinitializer以外の処理がおこなわれる前。
ApplicationEnvironmentPreparedEventcontextの中で使われる Environment が利用可能になったタイミング。
このタイミングからEnvironment が利用可能(ready)になるので、ここで他のBeanから利用される前に、状態を確認したり変更を加えることができる。
ApplicationContextInitializedEventApplicationContext が利用可能になり、ApplicationContextInitializers が呼び出されたタイミング。Bean定義はまだロードされていない。(DI前?)
Springコンテナにbeanを初期化する前に何らかの処理をしたい場合に使える。
ApplicationPreparedEventApllicationContext が利用可能( “refresh” 前)
Environment が利用可能(ready for use)になり、このあとbean定義がロードされる。
ContextRefreshedEventApplicationContext がrefreshされたとき。
ContextRefreshedEvent がSpring bootでなくSpringから直接送られる。SpringApplicationEvent の継承クラスではない。
WebServerInitializedEventWebサーバを構築している場合、サーバが利用可能になったタイミングで発火。
状況により ServletWebServerInitializedEventReactiveWebServerInitializedEvent になる。
ApplicationStartedEventcontextがrefreshされ、アプリケーションとcommand line runnerが実行される前。
ApplicationReadyEventアプリケーションがリクエストを受けられる状態になったタイミング。
ただし、まだすべての初期化が完了していないこのタイミングで内部状態を変更しない方がよい。
ApplicationFailedEvent例外や起動失敗した場合。起動中のいつでも発生しうる。
起動中失敗した場合の通知処理などはこれを利用できる。
調べながら、まだよく理解できずに書いている部分もあるので、そのあたりは理解が進んだところでまたアップデートしたい。

参考: https://reflectoring.io/spring-boot-application-events-explained/

実際にログを入れて見てみた。

@SpringBootApplication
public class SampleApplication {

    @Autowired
    private Environment environment;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(SampleApplication.class);
        app.addListeners(new SpringEventListener());
        app.run(args);
    }
}

@Slf4j
public class SpringEventListener implements ApplicationListener<SpringApplicationEvent> {
    @Override
    public void onApplicationEvent(SpringApplicationEvent event) {
        log.info(event.toString());
    }
}
22:38:06: Executing task ' bootRun'...

Starting Gradle Daemon...
Gradle Daemon started in 1 s 792 ms
> Task :compileJava
> Task :processResources UP-TO-DATE
> Task :classes
> Task :bootRunMainClassName

> Task :bootRun
2021-10-07 22:38:18.737  INFO 13616 --- [           main] n.u.tokyotrainnow.SpringEventListener    : org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent[source=org.springframework.boot.SpringApplication@954b04f]

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.3)

2021-10-07 22:38:18.803  INFO 13616 --- [           main] n.u.tokyotrainnow.SpringEventListener    : org.springframework.boot.context.event.ApplicationContextInitializedEvent[source=org.springframework.boot.SpringApplication@954b04f]
2021-10-07 22:38:18.806  INFO 13616 --- [           main] n.u.t.TokyotrainnowApplication           : Starting TokyotrainnowApplication using Java 16.0.2
2021-10-07 22:38:18.807  INFO 13616 --- [           main] n.u.t.TokyotrainnowApplication           : The following profiles are active: dev
2021-10-07 22:38:18.853  INFO 13616 --- [           main] n.u.tokyotrainnow.SpringEventListener    : org.springframework.boot.context.event.ApplicationPreparedEvent[source=org.springframework.boot.SpringApplication@954b04f]
2021-10-07 22:38:19.653  INFO 13616 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-10-07 22:38:19.664  INFO 13616 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-10-07 22:38:19.664  INFO 13616 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.50]
2021-10-07 22:38:19.749  INFO 13616 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-10-07 22:38:19.749  INFO 13616 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 895 ms
2021-10-07 22:38:20.122  INFO 13616 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-10-07 22:38:20.128  INFO 13616 --- [           main] n.u.t.TokyotrainnowApplication           : Active profiles: [dev]
2021-10-07 22:38:20.128  INFO 13616 --- [           main] n.u.t.ApplicationInitializer             : onApplicationEvent
2021-10-07 22:38:24.164  INFO 13616 --- [           main] n.u.t.TokyotrainnowApplication           : Started TokyotrainnowApplication in 5.755 seconds (JVM running for 6.293)
2021-10-07 22:38:24.166  INFO 13616 --- [           main] n.u.tokyotrainnow.SpringEventListener    : org.springframework.boot.context.event.ApplicationStartedEvent[source=org.springframework.boot.SpringApplication@954b04f]
2021-10-07 22:38:24.170  INFO 13616 --- [           main] n.u.tokyotrainnow.SpringEventListener    : org.springframework.boot.context.event.ApplicationReadyEvent[source=org.springframework.boot.SpringApplication@954b04f]

コメント

タイトルとURLをコピーしました