写在前面:
可扩展的内容:
- 初始化器(Initializer)
- 监听器(Listener)
- 容器刷新后置Runners(ApplicationRunner或者CommandLineRunner接口的实现类)
- 启动期间在Console打印Banner的具体实现类
先了解一下springboot running的流程
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
FailureAnalyzers analyzers = null;
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
//发送ApplicationStartedEvent,集成自ApplicationStartingEvent事件
listeners.starting();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//发送 ApplicationEnvironmentPreparedEvent
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
// 可通过重写org.springframework.boot.Banner的printBanner方法,修改打印的标记
Banner printedBanner = printBanner(environment);
// 创建了一个 public static final String DEFAULT_WEB_CONTEXT_CLASS = "org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext";
// 主要方法是下面的refreshContext(context);
context = createApplicationContext();
analyzers = new FailureAnalyzers(context);
//发送 contextPrepared,实现为空,外部无法监听
//在prepareContext最后,发送ApplicationPreparedEvent
//applyInitializers(context);自定义的初始化器
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
refreshContext(context);
// 调用ApplicationRunner或者CommandLineRunner,多个Runner可通过@order指定顺序,数字越小,优先级越高
afterRefresh(context, applicationArguments);
// 更具上下文初始化的情况,发送ApplicationFailedEvent或者ApplicationReadyEvent。这里exception为null,发送ApplicationReadyEvent
listeners.finished(context, null);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
return context;
}
catch (Throwable ex) {
// 更具上下文初始化的情况,发送ApplicationFailedEvent或者ApplicationReadyEvent。这里出现异常,发送ApplicationFailedEvent
handleRunFailure(context, listeners, analyzers, ex);
throw new IllegalStateException(ex);
}
}
一、Initializer
- ApplicationStartingEvent:springboot应用启动且未作任何处理(除listener注册和初始化)的时候发送ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent:确定springboot应用使用的Environment且context创建之前发送这个事件
- ApplicationPreparedEvent:context已经创建且没有refresh发送个事件
- ApplicationStartedEvent:context已经refresh且application and command-line runners(如果有) 调用之前发送这个事件
- ApplicationReadyEvent:application and command-line runners (如果有)执行完后发送这个事件,此时应用已经启动完毕.这个事件比较常用,常常在系统启动完后做一些初始化操作
- ApplicationFailedEvent:应用启动失败后产生这个事件
二、Listener
- ApplicationStartingEvent:springboot应用启动且未作任何处理(除listener注册和初始化)的时候发送ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent:确定springboot应用使用的Environment且context创建之前发送这个事件
- ApplicationPreparedEvent:context已经创建且没有refresh发送个事件
- ApplicationStartedEvent:context已经refresh且application and command-line runners(如果有) 调用之前发送这个事件
- ApplicationReadyEvent:application and command-line runners (如果有)执行完后发送这个事件,此时应用已经启动完毕.这个事件比较常用,常常在系统启动完后做一些初始化操作
- ApplicationFailedEvent:应用启动失败后产生这个事件
三、Runner
- ApplicationRunner
- CommandLineRunner
具体使用:
@Component
public class JDDRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(args);
System.out.println("这个是测试ApplicationRunner接口");
}
}
四、Banner
- org.springframework.boot.Banner的printBanner方法,修改打印的标记
- 在resoure下面简历banner.txt文件,指定输出