spring中初始化过程-源码解析
applicationContext会自动注册beanPostProcess等信息 而beanFactory需要手动注册addBeanPostProcess
第一步:通过配置文件/注解等方法读取信息

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

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

每个方法所做的功能如图所示,invokeBeanFactoryPostProcessors方法里加载了所有的beanDefinition信息到beanDefinitionMap里
我理解是调用了invokeBeanDefinitionRegistryPostProcessors后置处理器,之后invokeBeanDefinitionRegistryPostProcessors把所有的标注了不同注解类型的类注册进来,(比如@Bean @Import等),但是不确定
继续来分析Spring容器核心创建方法refresh()的最后一步finishBeanFactoryInitialization(beanFactory),
我们进入此方法:
这个方法里的东西呢我们只需关注最后一行即可,也就是beanFactory.preInstantiateSingletons();

getMergedLocalBeanDefinition方法。Bean定义公共的抽象类是AbstractBeanDefinition,普通的Bean在Spring加载Bean定义的时候,实例化出来的是GenericBeanDefinition,而Spring上下文包括实例化所有Bean用的AbstractBeanDefinition是RootBeanDefinition,这时候就使用getMergedLocalBeanDefinition方法做了一次转化,将非RootBeanDefinition转换为RootBeanDefinition以供后续操作。
在上图我们同样可以看到,开头通过beanName获取bean实例,如果获取到的实例不满足条件,就会调用核心代码getBean(beanName),这个方法也是Spring最核心的方法之一。我们把这个核心方法分为几部分来剖析:
第一部分

第二部分:
(我理解和jvm的双亲委派是同一个意思,先从父类找)
第三部分
第四部分:

第五部分:
接着看createBean方法

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

准备方法重写


浙公网安备 33010602011771号