在上篇文章中SpringApplication到底run了什么(上)中,我们分析了下面这个run方法的前半部分,本篇文章继续开工
1 | public ConfigurableApplicationContext run(String... args) { |
获取系统属性
spring.beaninfo.ignore
1 | private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) { |
但是这个属性的作用还真不知道。。
打印banner
根据当前环境创建ApplicationContext
1 | protected ConfigurableApplicationContext createApplicationContext() { |
基于咱们的Servlet环境,所以创建的ApplicationContext为AnnotationConfigServletWebServerApplicationContext
加载
SpringBootExceptionReporter,这个类里包含了SpringBoot启动失败后异常处理相关的组件
1 | private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, |
10 prepareContext 这一块还是比较长的
1 | private void prepareContext(ConfigurableApplicationContext context, |
1. 第一行,将context中相关的environment全部替换
1 |
|
2. 上下文后处理
1 |
|
这一块默认beanNameGenerator和resourceLoader都是空的,只有当我们自定义这两个对象时才会把容器内的bean替换
3. 执行所有的ApplicationContextInitializer的initialize方法
1 |
|
4. `listeners.contextPrepared(context)`这是个空方法,没有实现,一个Spring的扩展点
5. 打印profile
6. 注册bean:`springApplicationArguments`
7. 发布事件
1 | public void contextLoaded(ConfigurableApplicationContext context) { |
这里不仅发布了ApplicationPreparedEvent事件,还往实现了ApplicationContextAware接口的监听器中注入了context容器
8. load,其实就是创建了一个BeanDefinitionLoader对象
1 | protected void load(ApplicationContext context, Object[] sources) { |
容器的初始化
refreshContext
这个方法最后还是调用的AbstractApplicationContext类的refresh方法,由于篇幅过长这里就不展开了,感兴趣的同学可以参考这篇文章:基于注解的SpringIOC源码解析
1 | public void refresh() throws BeansException, IllegalStateException { |
afterRefresh
这里没有任何实现,Spring留给我们的扩展点停止之前启动的计时装置,然后发送
ApplicationStartedEvent事件调用系统中
ApplicationRunner以及CommandLineRunner接口的实现类,关于这两个接口的使用可以参考我的这篇文章:Java项目启动时执行指定方法的几种方式
1 | private void callRunners(ApplicationContext context, ApplicationArguments args) { |
异常处理
发送
ApplicationReadyEvent事件

如果文章对您有所帮助,收藏、转发、在看安排一下!!!
本文深入探讨Spring Boot启动过程中的关键步骤,包括ApplicationContext的创建、Bean的初始化、事件的发布等,揭示Spring Boot如何高效地启动应用。
8743

被折叠的 条评论
为什么被折叠?



