定义SpringApplicationRunListener来监听springApplication的启动
1.通过实现springApplicationRunListener来实现监听。
2.在 META-INF/spring.factories
中配置 org.springframework.boot.SpringApplicationRunListener=自己的Listener。
在默认的springboot配置中就有给我们配置了事件监听器。
配置了EvenPublishRunListener。
自定义myListener类。
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import java.time.Duration;
public class myListenter implements SpringApplicationRunListener {
@Override
public void starting(ConfigurableBootstrapContext bootstrapContext) {
SpringApplicationRunListener.super.starting(bootstrapContext);
System.out.println("starting");
}
@Override
public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
SpringApplicationRunListener.super.environmentPrepared(bootstrapContext, environment);
System.out.println("environmentPrepared");
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
SpringApplicationRunListener.super.contextPrepared(context);
System.out.println("contextPrepared");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
SpringApplicationRunListener.super.contextLoaded(context);
System.out.println("contextLoaded");
}
@Override
public void started(ConfigurableApplicationContext context, Duration timeTaken) {
SpringApplicationRunListener.super.started(context, timeTaken);
System.out.println("started");
}
@Override
public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
SpringApplicationRunListener.super.ready(context, timeTaken);
System.out.println("ready");
}
@Override
public void failed(ConfigurableApplicationContext context, Throwable exception) {
SpringApplicationRunListener.super.failed(context, exception);
System.out.println("failed");
}
}
在/META-INF/spring.factories。
org.springframework.boot.SpringApplicationRunListener=com.huang.listenter.myListenter
启动测试,效果为下:
SpringApplicationRunListener作用位置的源码分析
starting :应用开始,SpringApplication的run方法一调用,只要有了 BootstrapContext 就执行。(此时ioc容器还没有被启动)
调用位置:
environmentPrepared: 环境准备好(把启动参数等绑定到环境变量中),但是ioc还没有创建;【调一次】
调用位置:
contextPrepared:ioc容器创建并准备好,但是sources(主配置类)没加载。并关闭引导上下文;组件都没创建 【调一次】(看参数就可以推出现在要进行ioc启动时的配置)
调用位置(此时创建了ioc容器):
在ioc创建好并准备好后将 BootstrapContext关闭。
contextLoaded:ioc容器加载。主配置类加载进去了。但是ioc容器还没刷新(我们的bean没创建)。
调用位置:
且在此方法要在刷新ioc容器(将bean配置到ioc容器中)之前。
此方法就是刷新容器。(在此过程中就会自动创建服务器类,并将其配置到ioc容器中)
started:ioc容器刷新了(所有bean造好了),但是 runner 没调用。
调用位置:
ready:ioc容器刷新了(所有bean造好了),所有 runner 调用完了。
调用位置:
总结
重点掌握流程和各个方法的作用即可。