当前位置: 首页>后端>正文

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.????刷新应用上下问的扩展接口


https://www.xamrdz.com/backend/3t71934315.html

相关文章: