spring boot启动原理分析

springboot启动类中有两个关键的地方

1.@SpringBootApplication注解

2.SpringApplication.run方法

SpringBootApplication注解分析

SpringBootApplication注解由三大注解构成,

SpringBootConfigurationEnableAutoConfigurationComponentScan

SpringBootConfiguration中其实主要就是包装了Configuration注解

EnableAutoConfiguration是启动自动配置的注解,配合springboot中的starter模块进行自动注册功能

ComponentScan扫描bean,并注册到spring ioc容器中

EnableAutoConfiguration中主要是由

AutoConfigurationPackage注解、

Import(AutoConfigurationImportSelector.class)注解两个重要组成

AutoConfigurationPackage注解里边是通过自己配置的路径或者classes去注册class,或者通过Import(AutoConfigurationPackages.Registrar.class)去注册class

AutoConfigurationImportSelector中会使用SpringFactoriesLoader.loadFactoryNames()方法去加载配置在META-INF/spring.factories文件中的EnableAutoConfiguration类(例如 spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.martin.spb.autoconfigure.configuration.MartinAutoConfiguration,此处加载的是MartinAutoConfiguration)

AutoConfigurationImportSelector类的selectImports方法会将配置文件中配置配置的class解析到string[]中并返回

SpringApplication.run方法分析

静态方法run最终会初始化一个SpringApplication的实例,然后调用实例的run方法,源码截图如下:

spring boot启动原理分析_第1张图片

 

有几个重要的方法需要说明下

1.获取SpringApplicationRunListeners,通过工具SpringFactoriesLoader.loadFactoryNames获取SpringApplicationRunListener.class(是不是有点眼熟,在EnableAutoConfiguration中也有使用到这个工具来获取,那里获取的是EnableAutoConfiguration.class类)

2.调用SpringApplicationRunListeners.staring方法

3.创建环境prepareEnvironment,生成ConfigurableEnvironment对象

4.Banner打印相关

5.创建上下文,createApplicationContext生成ConfigurableApplicationContext对象

6.初始化上下文,prepareContext

7.刷新上下文信息,refreshContext

8.上下文信息填充完毕,afterRefresh

9.调用SpringApplicationRunListeners.started方法

10.调用callRunners方法

11.调用SpringApplicationRunListeners.running方法

步骤6中的prepareContext方法会把springboot的入口类(就是springbootapplication注解标记的类)注册到context中。

步骤7中的refreshContext,会调用context的refresh方法,然后refresh方法中的invokeBeanFactoryPostProcessors会将注册到容器中的BeanFactoryPostProcessor类型的bean(如ConfigurationClassPostProcessor类),执行对应的postProcess方法去处理bean

需要注意的是invokeBeanFactoryPostProcessors方法中在处理bean的时候,会通过ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法中的processConfigBeanDefinitions方法,此处会去遍历当前容器中所有的bean定义(getBeanDefinitionNames方法),如果该bean被Configuration注解标记,那么会对该bean进行进一步解析,其中包括处理Import注解注入的类,这里就与EnableAutoConfiguration关联上了。

你可能感兴趣的:(spring,spring,boot,java,spring)