springboot启动类中有两个关键的地方
1.@SpringBootApplication注解
2.SpringApplication.run方法
SpringBootApplication注解分析
SpringBootApplication注解由三大注解构成,
SpringBootConfiguration、EnableAutoConfiguration、ComponentScan。
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方法,源码截图如下:
有几个重要的方法需要说明下
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文章来源:https://www.toymoban.com/news/detail-513191.html
需要注意的是invokeBeanFactoryPostProcessors方法中在处理bean的时候,会通过ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法中的processConfigBeanDefinitions方法,此处会去遍历当前容器中所有的bean定义(getBeanDefinitionNames方法),如果该bean被Configuration注解标记,那么会对该bean进行进一步解析,其中包括处理Import注解注入的类,这里就与EnableAutoConfiguration关联上了。文章来源地址https://www.toymoban.com/news/detail-513191.html
到了这里,关于spring boot启动原理分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!