Spring BootにはSpirngApplicationのライフサイクルにしたがったApplicationEventが定義されているが、調べていてそれらの情報があまり出てこなかったので調べてみた。
Spring Boot の ApplicationEvent一覧
ApplicationStartingEvent | 実行開始時。listenerの登録やinitializer以外の処理がおこなわれる前。 |
ApplicationEnvironmentPreparedEvent | contextの中で使われる Environment が利用可能になったタイミング。このタイミングから Environment が利用可能(ready)になるので、ここで他のBeanから利用される前に、状態を確認したり変更を加えることができる。 |
ApplicationContextInitializedEvent | ApplicationContext が利用可能になり、ApplicationContextInitializers が呼び出されたタイミング。Bean定義はまだロードされていない。(DI前?)Springコンテナにbeanを初期化する前に何らかの処理をしたい場合に使える。 |
ApplicationPreparedEvent | ApllicationContext が利用可能( “refresh” 前)Environment が利用可能(ready for use)になり、このあとbean定義がロードされる。 |
ContextRefreshedEvent | ApplicationContext がrefreshされたとき。ContextRefreshedEvent がSpring bootでなくSpringから直接送られる。SpringApplicationEvent の継承クラスではない。 |
WebServerInitializedEvent | Webサーバを構築している場合、サーバが利用可能になったタイミングで発火。 状況により ServletWebServerInitializedEvent か ReactiveWebServerInitializedEvent になる。 |
ApplicationStartedEvent | contextが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]
コメント