SringBoot启动类有两大核心:一个是注解@SpringBootApplication,一个是main方法里面的SpringApplication.run。
1.通过main方法启动SpringBoot。
public static void main(String[] args) {
SpringApplication.run(StrayCatSpringbootApplication.class, args);
}
2. 进入SpringApplication类run方法。
3.run方法新建SpringApplication对象。
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return (new SpringApplication(primarySources)).run(args);
}
4.SpringApplication对象的run方法,首先创建并启动计时监控类。
5.接着调用getRunListeners创建所有spring监听器。
private SpringApplicationRunListeners getRunListeners(String[] args) {
Class<?>[] types = new Class[]{SpringApplication.class, String[].class};
return new SpringApplicationRunListeners(logger, this.getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup);
}
SpringApplicationRunListeners listeners = this.getRunListeners(args);
6.接着 DefaultApplicationArguments ,初始化应用参数。
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
7.接着 prepareEnvironment 根据运行监听器和参数准备spring环境。
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
8.接着调用 createApplicationContext 方法创建应用上下文。
protected ConfigurableApplicationContext createApplicationContext() {
return this.applicationContextFactory.create(this.webApplicationType);
}
context = this.createApplicationContext();
9.通过prepareContext准备应用上下文。
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
10.refreshContext 方法刷新上下文(通过spring ioc模板方法初始化)。
this.refreshContext(context);
11.调用stop方法停止计时监控器类。
12.调用started分布执行所有runner运行器。
listeners.started(context, timeTakenToStartup);
13.callableRunners 方法执行所有runner运行器。
private void callRunners(ApplicationContext context, ApplicationArguments args) {
List<Object> runners = new ArrayList();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
AnnotationAwareOrderComparator.sort(runners);
Iterator var4 = (new LinkedHashSet(runners)).iterator();
while(var4.hasNext()) {
Object runner = var4.next();
if (runner instanceof ApplicationRunner) {
this.callRunner((ApplicationRunner)runner, args);
}
if (runner instanceof CommandLineRunner) {
this.callRunner((CommandLineRunner)runner, args);
}
}
}
this.callRunners(context, applicationArguments);
14.调用 running 分布应用上下文就绪事件。
15.最后返回应用上下文。