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