SpringBoot启动过程
2025-02-08 11:23:56 0 举报
AI智能生成
分析SpringBoot启动过程源码
作者其他创作
大纲/内容
调用run()方法
创建并初始化DefaultBootstrapContext
从spring.factories中获取SpringApplicationRunListener
默认提供了一个EventPublishingRunListener,在接下来的启动过程中负责发布事件
调用SpringApplicationRunListener的starting()
发布ApplicationStartingEvent事件
事件发布都是同步的
将启动参数args封装为ApplicationArguments对象
准备Environment
创建Environment对象
调用SpringApplicationRunListener的environmentPrepared()
发布ApplicationEnvironmentPreparedEvent事件
EnvironmentPostProcessorApplicationListener会处理该事件,从而解析各种配置文件,从spring.factories中获取EnvironmentPostProcessor,然后分别往Environment中添加配置
RandomValuePropertySourceEnvironmentPostProcessor
可以直接生成随机数,@Value("${random.int,100}")
SystemEnvironmentPropertySourceEnvironmentPostProcessor
如果SpringApplication设置了prefix,那么获取配置时只能获取到这个prefix开头的操作系统环境变量
SpringApplicationJsonEnvironmentPostProcessor
可以在命令行配置:--spring.application.json={\"k1\":\"v1\"}
CloudFoundryVcapEnvironmentPostProcessor
忽略,CloudFoundry是业界第一个开源PaaS云平台
ConfigDataEnvironmentPostProcessor
重点,负责解析各个地方的application.properties和application.yml
IntegrationPropertiesEnvironmentPostProcessor
Spring全家桶中有一个项目spring integration,感兴趣可以自行研究
DebugAgentEnvironmentPostProcessor
根据配置的情况,决定是否要执行某个方法
打印Banner
创建Spring容器(ApplicationContext)
根据应用类型进行创建
NONE
AnnotationConfigApplicationContext
SERVLET
AnnotationConfigServletWebServerApplicationContext
REACTIVE
AnnotationConfigReactiveWebServerApplicationContext
预处理Spring容器
把Environment设置给Spring容器
利用ApplicationContextInitializer初始化Spring容器
调用SpringApplicationRunListener的contextPrepared()
发布ApplicationContextInitializedEvent事件
关闭DefaultBootstrapContext
相当于完成了引导启动,在上述过程中,可以通过DefaultBootstrapContext来共享对象,避免某些对象需要重复创建,提升性能
将配置类注册到Spring容器中
调用SpringApplicationRunListener的contextLoaded()
发布ApplicationPreparedEvent事件
刷新Spring容器
解析配置类
解析@ComponentScan进行扫描
解析@EnableAutoConfiguration进行配置类解析
Spring容器刷新后处理,空方法,扩展点,模板方法
调用SpringApplicationRunListener的started()
发布ApplicationStartedEvent事件
调用ApplicationRunner和CommandLineRunner
会传入前面创建的ApplicationArguments,也就是启动参数args
调用SpringApplicationRunListener的ready()
发布ApplicationReadyEvent事件
构造SpringApplication对象
记录传入的配置类在primarySources
推测应用类型
非web应用:NONE
SERVLET应用
REACTIVE(WEBFLUX)应用
从spring.factories中获取BootstrapRegistryInitializer
BootstrapRegistryInitializer是用来初始化BootstrapRegistry的(DefaultBootstrapContext)
从spring.factories中获取ApplicationContextInitializer
ApplicationContextInitializer是用来初始化ApplicationContextSpring容器的
从spring.factories中获取ApplicationListener
推测出Main类(main()方法所在的类)
0 条评论
下一页