spring context启动入口方法:
org.springframework.boot.SpringApplication#run(java.lang.String...)
//加载环境以及propertie文件等常量
org.springframework.boot.SpringApplication#prepareEnvironment
//创建BeanFactory
org.springframework.boot.SpringApplication#createApplicationContext
//为后续的context中bean的加载初始化一些加载器Bean定义到BeanFactory.
org.springframework.boot.SpringApplication#prepareContext
//装载Bean
org.springframework.boot.SpringApplication#refreshContext
其中分为几个环节:
1)对BeanFactory进行配置
org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
2)执行BeanFactory创建后的额外的上下文相关的配置(视具体上下文的定制化逻辑决定,如spring-web,会将BeanFactory引用加入到servletContext中 ),下面是三种context下的例子:
org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#postProcessBeanFactory
org.springframework.web.context.support.GenericWebApplicationContext#postProcessBeanFactory
3)执行前面步骤加入到的BeanFactoryPostProcessor。
org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
1.优先执行org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor的processor,可以
加载beandefinition到beanFactory.
优先执行的是ConfigurationClassPostProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions
可以加载不同定义路径的Bean。
org.springframework.context.annotation.ConfigurationClassParser#parse(java.util.Set
第一种是根据@SpringBootApplication注解获取相关的bean定义。
@ComponentScan是@SpringBootApplication的别名,所以有SpringBootApplication的注解会自动扫描其项目下的包,根据注解识别是否该创建为bean。
并且还会扫描注解类的所有注解(含注解类的注解),找到该类下所有注解类为org.springframework.context.annotation.Import的value值。
org.springframework.context.annotation.ConfigurationClassParser#collectImports
找到所有import的value中使用的类后进行bean的引入,根据value对应的引入类的不同,进行不同的引入策略
org.springframework.context.annotation.ConfigurationClassParser#processImports
分为三种:
1 org.springframework.context.annotation.ImportSelector
使用下方法根据选择器获得使用org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置,再加载bean
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry
2 org.springframework.context.annotation.ImportBeanDefinitionRegistrar
条件引入bean
3 其他
@Configuration的注解引入
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors