01. Spring Boot 启动流程
2022-03-20 13:58:37 0 举报
AI智能生成
Spring Boot 启动流程
作者其他创作
大纲/内容
@SpringBootApplication<br>启动条件 1:注解
@SpringBootConfiguration<br>代表它是容器中的一个配置类<br>
@Configuration<br>配置类会被容器中的【ConfigurationClassPostProcessor】组件分析<br>所以其它注解就会被这个组件解析,从而完成相应的功能
@EnableAutoConfiguration<br>组合注解
@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class)<br>这个组件的作用是为了获取扫包路径
@Import({AutoConfigurationImportSelector.class})<br>向容器中导入【AutoConfigurationImportSelector】组件
AutoConfigurationGroup<b>.</b>process()<br>启动时会回调这个方法
getAutoConfigurationEntry()<br>获取所有需要自动装配的类
getCandidateConfigurations()<br>获取所有候选的配置类
SpringFactoriesLoader.loadFactoryNames()<br>Springboot 的 SPI 机制<br>从【META-INF/spring.factories】文件获取所有 key 为【EnableAutoConfiguration】的配置类<br>
configurations.removeAll(exclusions)<br>移除一些配置类,通过注解中的 exclude 属性指定
getConfigurationClassFilter().filter(configurations)<br>对所有的配置类进行过滤筛选
@ComponentScan<br>配置扫描策略
SpringApplication.run()<br>启动条件 2:启动类<br>
SpringApplication#<init><br>配置类初始化
deduceFromClasspath() <div><font color="#323232">判断环境</font></div>
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class))<br>从 META-INF/spring.factories 目录下获取 ApplicationContextInitializer 类型,并设置到 initializers 属性中<br>
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class))<br>从 META-INF/spring.factories 目录下获取 ApplicationListener 类型,并设置到 listeners 属性中<br>
<div>deduceMainApplicationClass()<br></div><div>从传入的配置类中寻找 main 方法所在的类,赋值给 mainApplicationClass</div>
SpringApplication.run()<br>真正执行 run() 方法
getRunListeners(args)<br>从 META-INF/spring.factories 目录下获取 SpringApplicationRunListener 类型<br>
EventPublishingRunListener#<init><br>将 SpringApplication 中的 listeners 添加到 initialMulticaster 属性中<br>以后就可以对这些监听器进行事件派发
<div>listeners.starting()<br></div><div>回调所有 SpringApplicationRunListener 的 starting() 方法</div>
EventPublishingRunListener.starting()<br>向所有的 listeners 发布 ApplicationStartingEvent 事件
<div>prepareEnvironment()<br></div><div>初始化上下文环境</div>
getOrCreateEnvironment()<br><div></div>准备或者创建环境
AbstractEnvironment#<init><br>环境初始化
configureEnvironment(environment, applicationArguments.getSourceArgs())<br>根据启动参数配置环境<br>
configurePropertySources(environment, args)<br>如果有启动参数,就初始化 SimpleCommandLinePropertySource<br>
configureProfiles(environment, args)<br>为 environment 配置 ActiveProfiles<br>
ConfigurationPropertySources.attach(environment)
listeners.environmentPrepared(environment)<br><div></div>回调所有 SpringApplicationRunListener 的 environmentPrepared() 方法<br>
EventPublishingRunListener.environmentPrepared()<br>向所有的 listeners 发布 ApplicationEnvironmentPreparedEvent 事件
ConfigurationPropertySources.attach(environment)<br>再执行这个方法,已经配置过会先移除再重新设置<br>
printBanner(environment)<br>打印 banner 信息<br>
<div>createApplicationContext()<br></div><div>创建 Spring IOC 容器<br>注意这里才是真正的 Spring IOC 容器,之前的仅仅是 SpringApplication 配置类而已</div>
prepareContext()<br>准备上下文环境<br>
context.setEnvironment(environment)<br>覆盖刚刚创建 IOC 容器中的 environment
applyInitializers(context)<br>回调所有 ApplicationContextInitializer 的 initialize() 方法<br>
listeners.contextPrepared(context)<br>回调所有 SpringApplicationRunListener 的 contextPrepared() 方法<br>
EventPublishingRunListener.contextPrepared()<br>向所有的 listeners 发布 ApplicationContextInitializedEvent 事件<br>
load(context, sources.toArray(new Object[0]))<br>将启动类转成 BeanDefinition 注册到容器中,启动 Spring 容器的前置步骤
listeners.contextLoaded(context)<br>回调所有 SpringApplicationRunListener 的 contextLoaded() 方法
EventPublishingRunListener.contextLoaded()<br>向所有的 listeners 发布 ApplicationPreparedEvent 事件
<div>refreshContext(context)</div><div><span style="font-size: inherit; color: rgb(50, 50, 50); --darkreader-inline-color:#292e31;" data-darkreader-inline-color="">刷新 Spring IOC 容器</span></div>
listeners.started(context)<br>回调所有 SpringApplicationRunListener 的 started() 方法
EventPublishingRunListener.started()<br>向所有的 listeners 发布 ApplicationStartedEvent 事件
<div>callRunners(context, applicationArguments)<br></div><div>从容器中获取所有的 ApplicationRunner 和 CommandLineRunner,回调 run() 方法</div>
listeners.running(context)<br>回调所有 SpringApplicationRunListener 的 running() 方法
EventPublishingRunListener.running()<br>向所有的 listeners 发布 ApplicationReadyEvent 事件
0 条评论
下一页