applicationContext会自动注册beanPostProcess等信息 而beanFactory需要手动注册addBeanPostProcess

第一步:通过配置文件/注解等方法读取信息

java spring 常量初始化 spring初始化流程图_java spring 常量初始化

 第二步:进入到方法里发现做了如下三个步骤

java spring 常量初始化 spring初始化流程图_配置文件_02

 1:资源匹配 2:读取配置文件,获取到environment对象(加载系统属性值以及系统环境信息),并且解析配置文件(整个变量值替换) 3 整个spring初始化核心(代码分析如下)

 

java spring 常量初始化 spring初始化流程图_实例化_03

每个方法所做的功能如图所示,invokeBeanFactoryPostProcessors方法里加载了所有的beanDefinition信息到beanDefinitionMap里

我理解是调用了invokeBeanDefinitionRegistryPostProcessors后置处理器,之后invokeBeanDefinitionRegistryPostProcessors把所有的标注了不同注解类型的类注册进来,(比如@Bean @Import等),但是不确定

继续来分析Spring容器核心创建方法refresh()的最后一步finishBeanFactoryInitialization(beanFactory),

我们进入此方法:

java spring 常量初始化 spring初始化流程图_java spring 常量初始化_04

 这个方法里的东西呢我们只需关注最后一行即可,也就是beanFactory.preInstantiateSingletons();

java spring 常量初始化 spring初始化流程图_配置文件_05

getMergedLocalBeanDefinition方法。Bean定义公共的抽象类是AbstractBeanDefinition,普通的Bean在Spring加载Bean定义的时候,实例化出来的是GenericBeanDefinition,而Spring上下文包括实例化所有Bean用的AbstractBeanDefinition是RootBeanDefinition,这时候就使用getMergedLocalBeanDefinition方法做了一次转化,将非RootBeanDefinition转换为RootBeanDefinition以供后续操作

在上图我们同样可以看到,开头通过beanName获取bean实例,如果获取到的实例不满足条件,就会调用核心代码getBean(beanName)这个方法也是Spring最核心的方法之一。我们把这个核心方法分为几部分来剖析:

第一部分

java spring 常量初始化 spring初始化流程图_配置文件_06

 第二部分:

 

java spring 常量初始化 spring初始化流程图_配置文件_07

 (我理解和jvm的双亲委派是同一个意思,先从父类找)

 第三部分

 

java spring 常量初始化 spring初始化流程图_加载_08

  第四部分:

java spring 常量初始化 spring初始化流程图_配置文件_09

第五部分:

接着看createBean方法

java spring 常量初始化 spring初始化流程图_java spring 常量初始化_10

 上图代码是判断该bean的class是否存在,也就是该bean是可以通过class创建的 

java spring 常量初始化 spring初始化流程图_配置文件_11

 准备方法重写

java spring 常量初始化 spring初始化流程图_加载_12

这边有个return,也就是说这边有可能提前返回bean,看注释:Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.我们以前在beanPostProcessor时说过,beanPostProcessor是可以临时修改bean的,它的优先级高于正常实例化bean的(也就是后续实例化该bean的过程),如果beanPostProcessor能返回,则直接返回了

最后调用了doGreateBean方法

doGreateBean方法里去执行真正的实例化动作

一般是先从工厂中删除一遍,确保单例对象不会被重复创建,在通过反射去实例化对象

java spring 常量初始化 spring初始化流程图_java spring 常量初始化_13