SpringApplication初始化过程

SpringAppliction.run(xxx.class, args);


准备过程:

    1.    首先会判断当前环境类型,一般是servlet环境(通过在ClassPath下是否存在某些类来判断)

    2.    初始化META-INF/spring.factories中已经配置的ApplicationContextInitializer 初始化器和  ApplicationListener监听器,获取main方法的类名。


执行过程:

     1.    获取SpringApplicationRunListener监听器(负责在SpringBoot启动的不同阶段,广播出不同的消息,传递给ApplicationListenener监听器实现类),并启动。


    2.    构造引用上下文环境(ConfigurableEnviroment):通过判断当前应用类型,来创建不同的应用环境(包括系统环境的信息,JDK信息,application.yml文件的信息等, 打印spring启动的图标。


    3.    初始化应用上下文CreateAppilictionContext() :将DefaultListableBeanFactory类(IOC容器)创建并作为属性填充至Context中, 获取SpringBootExceptionReporter类(用于报告关于启动的错误)。


    4.    刷新应用上下文前的准备阶段prepareContext() :

            a)首先将2构造的上下文环境注入3创建的context

            b)将IOC容器设置转换器。

            c)将准备过程中获取的初始化器执行,向各个监听器发送 容器已经准备好了的事件

            d)将启动类注册到IOC容器里。(Spring容器在启动的时候,会将bean解析成spring内部的BeanDefinition结构,并将BeanDefinition使用BeanDefinitionLoader 存储到DefaultListableBeanFactory的map中)  

                          => 创建BeanDefinitionRegistry (用于解析注解形式的Bean定义,例如@Controller,@Service等,也能解析XML形式的Bean定义)

                          => 使用刚创建的BeanDefinitionRegistry来创建BeanDefinitionLoader           

                          => 调用BeanDefinitionLoader.load(),将启动类put进DefaultListableBeanFactory的map中。


    5.    刷新应用上下文:(SpringBoot的自动装配以及Tomcat启动都在这里被执行)

            spring初始化IOC容器的过程(三个步骤)。调用:invokeBeanFactoryPostProcessors(beanFactory) 

             1,第一步:Resource定位

                      定位basePackage的路径中@Bean等注解的类,定位使用@Import注解指定的类 ,定位SPI扩展机支的自动配置获取到的类 

             2,第二步:BeanDefinition的载入

                       将定位到的类的路径拼接成:classpath:com/**/**.class 这样的形式。然后解析器类会将该路径下的.class文件加载,如果有@Component注解,就会将该类的BeanDefinition载入。使用dfs找到所有@Imports的导入的组件类,通过AutoConfigurationImportSelector找到所有需要的SpringBoot自动配置类,然后将找到的类的BeanDefinition都载入DefaultListableBeanFactory的map中。

             3,第三步:注册BeanDefinition

                      通过调用上文提到的BeanDefinitionRegister接口的实现来完成,将第二步加载的BeanDefinition 注入到一个ConcurrentHashMap中(IOC容器通过这个HashMap来持有BeanDefinition数据)


    6.    刷新应用上下问的扩展接口

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容