ApplicationContextInitializer
ApplicationListener
Spring容器启动流程
Ⅰ几个重要的事件回调机制
配置在META-INF/spring.factories中
ApplicationContextInitializer————(应用初始化器)
SpringApplicationRunListener————(Spring应用运行监听器)
放置在IOC容器中
ApplicationRunner————(应用运行器)
CommandLineRunner————(命令行运行器)
Ⅱ简述流程:
SpringApplication.run(BootStartAndRunApplication.class, args);
//《一、创建Spring应用对象》————找到并保存初始化器和监听器。
1、new SpringApplication(primarySources);
//判断当前的web应用的类型 ———— SERVLET
1)this.webApplicationType = WebApplicationType.deduceFromClasspath();
//从类路径下的META-INF/spring.factories配置中找到所有的ApplicationContextInitializer,保存起来。
2)this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
//从类路径下的META-INF/spring.factories配置中找到所有的ApplicationListener,保存起来。
3)this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
//从多个配置类中找到有main方法的主配置类(@SpringBootApplication标注的主程序类、主入口类)
4)this.mainApplicationClass = this.deduceMainApplicationClass();
//《二、调用对象的run方法》
2、SpringApplication.run(args);
//创建一个默认的 引导用的上下文(一个容器)
1)DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
//获取之前保存起来的所有SpringApplicationRunListener
2)SpringApplicationRunListeners listeners = this.getRunListeners(args);
//回调所有SpringApplicationRunListener的starting方法(传参:默认的引导上下文、主配置类)
3)listeners.starting(bootstrapContext, this.mainApplicationClass);
//封装命令行参数
4)ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//准备环境
5)ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
//创建环境
· ConfigurableEnvironment environment = this.getOrCreateEnvironment();
//SpringApplicationRunListener回调函数:environmentPrepared,表示环境准备完成
· listeners.environmentPrepared(bootstrapContext, (ConfigurableEnvironment)environment);
//将准备好的环境返回
· return (ConfigurableEnvironment)environment;
//console 打印springboot banner图标
6)Banner printedBanner = this.printBanner(environment);
//根据容器类型创建IOC容器
7)context = this.createApplicationContext();
//开始准备容器。
//(引导用的上下文、上一步刚创建好的IOC容器、第⑤步准备的环境、listeners、命令行参数、banner)
8)this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
//将准备好的环境保存到IOC容器中
· context.setEnvironment(environment);
//保存完环境,后处理IOC容器
· this.postProcessApplicationContext(context);
//初始化容器
· this.applyInitializers(context);
//回调步骤:1)、②保存好的ApplicationContextInitializer的initialize方法。(初始化容器)
initializer.initialize(context);
//SpringApplicationRunListener监听到容器准备好了。
· listeners.contextPrepared(context);
//环境准备完成,回调所有SpringApplicationRunListeners的contextLoaded完成容器装载。
· listeners.contextLoaded(context);
//刷新容器,IOC容器初始化
//(扫描、创建、加载所有组件的地方,如:配置类,组件,自动配置)
9)this.refreshContext(context);
public abstract class AbstractApplicationContext
public void refresh()
this.finishBeanFactoryInitialization(beanFactory);
//SpringApplicationRunListener监听到容器已启动。
10)listeners.started(context);
11)this.callRunners(context, applicationArguments);
//从IOC容器获取所有的ApplicationRunner、CommandLineRunner再进行回调。
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
//先回调ApplicationRunner,再回调CommandLineRunner。
this.callRunner((ApplicationRunner)runner, args);
this.callRunner((CommandLineRunner)runner, args);
//最后,将创建好的IOC容器返回。至此,spring应用已成功启动。
12)return context;
0 条评论