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