SpringBoot IOC初始化流程

SpringBoot IOC初始化流程

1、使用 SpringApplication 的静态 run() 方法。

2、创建一个 SpringApplication 对象实例,然后调用这个创建好的 SpringApplication 的实例 run()方 法。

3、根据 WebApplicationType.deduceFromClasspath()决定决定是否应该创建一个 Web 应用使用的 ApplicationContext 类型,还是应该创建一个标准 Standalone 应用使用的 ApplicationContext 类型。

4、使用 SpringFactoriesLoader 在应用的 classpath 中查找并加载所有可用的ApplicationContextInitializer。

5、使用 SpringFactoriesLoader 在应用的 classpath 中查找并加载所有可用的 ApplicationListener。

6、SpringApplication 实例初始化完成并且完成设置后,就开始执行 run 方法。

7、首先遍历执行所有通过 SpringFactoriesLoader 可以查找到并加载的 SpringApplicationRunListener,调用它们的 starting() 方法。

8、创建并配置当前 SpringBoot 应用将要使用的 Environment(包括配置要使用的 PropertySource 以及 Profile)。

9、遍历调用所有 SpringApplicationRunListener 的 environmentPrepared()的方法。

10、如果 SpringApplication的showBanner 属性被设置为 true,则打印 banner(SpringBoot 1.3.x版本)

11、根据用户是否明确设置了applicationContextClass 类型以及初始化阶段的推断结果,决定该为当前 SpringBoot 应用创建什么类型的 ApplicationContext 并创建完成,然后根据条件决定是否添加 ShutdownHook,决定是否使用自定义的 BeanNameGenerator,决定是否使用自定义的 ResourceLoader。

12、ApplicationContext 创建好之后,SpringApplication 会再次借助 SpringFactoriesLoader,查找并加载 classpath 中所有可用的 SpringApplicationExceptionReporter。

13、开始准备ApplicationContext ,将之前准备好的 Environment 设置给创建好的 ApplicationContext 使用,遍历调用所有 SpringApplicationRunListener 的 initialize()、contextPrepared()方法。

14、最核心的一步,将之前通过 @EnableAutoConfiguration 获取的所有配置以及其他形式的 IoC 容器配置加载到已经准备完毕的 ApplicationContext。

15、遍历调用所有 SpringApplicationRunListener 的 contextLoaded() 方法。

16、调用 ApplicationContext 的 refresh() 方法,完成 IoC 容器可用

17、查找当前 ApplicationContext 中是否注册有ApplicationRunner 、CommandLineRunner,如果有,则遍历执行它们。

18、正常情况下,遍历执行 SpringApplicationRunListener 的 finished() 方法 (已完成)。

19、SpringBoot 应用启动完毕。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值