springApplication构造生成
实例化spring.factories里面声明类型为 ApplicationContextLinitializer和ApplicationListener的一些实现类
加载spring.factories
1:读取项目下的所有spring.factories
2:将读取出的内容存入map,key是左边的声明类,value是右边逗号拼接的类的集合
3:最后放入内存缓存中
根据传入的声明类的类型,实例化所有spring.factories右边的定义类,最终返回。
1:实例化用的是默认构造器反射生成对象,如果实现了ordered接口则会进行排序。
springApplication Run方法
1:加载spring.factories,如果有缓存就直接拿出来。找到SpringApplicationRunListener实例化
EventPublishingRunListener。通过构造器实例化的时候会把application加载好的所有applicationListener存入到EventPublishingRunListener
2:根据不同的流程启动不同的监听器
3:准备spring的配置文件阶段
启动applicationListener,找到所有环境准备阶段需要执行的ApplicationListener包括ConfigApplicationListener等
initializeProfiles()加载存在已经激活的 profiles,有自己设置的则加载自己设置的profiles,存储进入enviroment的mutablePropertySources
load(profile, this::getPositiveProfileFilter,addToLoaded(MutablePropertySources::addLast, false))搜索约定配置文件的位置,循环每个位置,获取每个位置下的文件名称再进行加载,按照文件名称的后缀,获取具体的资源加载器,进行具体文件的加载过程
4:创建springboot用的容器AnnotationConfigServletWebServerApplicationContext
5:刷新spring容器
spring Bean加载 AbstractApplicationContext
1:refresh()
2:prepareRefresh()准备此上下文以进行刷新、设置其启动日期和 active 标志以及执行属性源的任何初始化
3:obtainFreshBeanFactory()设置spring容器唯一id,得到spring的bean工厂 DefaultListableFactory
4:prepareBeanFactory(beanFactory)配置一些基础的上下文加载器和一些后置处理器
5:postProcessBeanFactory(beanFactory)注册ServletContextAwareProcessor处理器,注册request,session
6:(核心)invokeBeanFactoryPostProcessors(beanFactory)注册调用一些核心的beanfactorypostprocessor
实例化并且调用所有已经注册beanFactoryPostprocessor。按需排序。
首先调用beanDefinitionRegistoryPostProcessors。注册bean
CachingMetadataReaderFactoryPostProcessor(beanFactoryPostprocessor)此处会加载一个重要的BeanDefinitionRegistryPostProcessor就是ConfigurationClassPostProcessor(核心类)
此处会调用ConfigurationClassPostPorcessor在已经加载到容器中的bean里面找到带有@Configuration注解的类。即也就是启动类
解析@Configuration注解的类
解析application上的注解,包含@PropertySource,@componentScan,@Import,@ImportResource
当解析到@ComponentScan时扫描项目中所有的@Component注解的类的bean定义加载进入bean工厂。
如果存在@Conditional条件的注解,也会进行相应的过滤不加载
如果没有配置扫描路径,默认的扫描路径时application包路径的前置路径下。此处doScan会扫描包路径下的所有@Component注解类,并且将bean定义注册进入bean工厂
加载所有@component注解的类的bean定义
将@Configuration注解的类进行解析
循环处理配置类configClass直到sourceClass变为null,加载其中嵌套的类
doProcessConfigurationClass的返回值是其参数configClass的父类,
如果该父类是由Java提供的类或者已经处理过,返回null
从配置类解析一切可能的bean形式,内部类,成员方法,@Import等,返回值为父类,继续解析父类直到
处理@Import注解的类,包含ImportSelector导入的类,ImportBeanDefinitionRegistrar导入的类,
如果是@import导入的类的话就默认当作@configuration类处理
处理@Configuration注解类中有@bean注解的方法
将configuration注解的所有嵌套类进行bean定义的加载。
configuration注解等的相关bean定义,项目下的bean定义加载完毕
beanDefinitionRegistoryPostProcessor此处支持扩展
将@configuration注解的类做一层代理
目的是为了解决@Bean单例问题
开始执行beanFactoryPostprocessor
加载占位符配置解析器
7:注册beanpostprocessor
将beanPostProcessor按照顺序一次加载进入beanFactory
将CommonAnnotationBeanPostProcessor,AutoWiredAnnotationBeanPostProcessor重新注入beanfactory在beanpostprocessor列表末尾
8:(核心)刷新beanFactory加载bean
从bean工厂获取到所有的bean定义。加载实例化&初始化
根据beanName获取bean对象
从一,二, 三级缓存中尝试获取已经创建好的实例对象
创建单例实例对象并放入缓存中
根据反射创建bean实例对象放入beanWrapper
查找合适的构造器进行实例化
mergedBeandefinition的后置处理器,有commonAnnotationBeanPostProcessor(处理@PostConstruct,@PreDestroy注解)AutowiredAnnotationBeanPostprocessor(处理@Autowired@Value)
commonAnnotationBeanPostProcessor:析出当前bean类的字段或方法上有@WebServiceRef,@EJB,@Resource,@PostConstruct,@value等注解。获取其注解信息
AutowiredAnnotationBeanPostprocessor:解析出当前bean类的字段上或方法上有@Autowired和@value注解的字段或方法。获取注解信息
将已经创建的bean实例缓存起来。即使它并没有初始化完全。可以解决bean循环引用的问题
bean的属性填充和属性初始化