这个方法是 spring中最重要的方法,功能点
1.bean的实例化过程
2.ioc
3.注解支持
4.BeanPostProcessor的执行
5.AOP的入口
这个方法会把 所有的非懒加载的bean的单例bean加载,除了前面学过的两个接口实现类(
BeanFactoryPostProcessor 接口,
BeanPostProcessor 接口),还有就是一些内部bean
下面是代码流程
preInstantiateSingletons方法的核心代码
![](https://img-blog.csdnimg.cn/20210526212129886.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
我们来看看getMergedLocalBeanDefinition()这个方法,看注解是把父的beanDefinition里面的属性 拿到子的beanDefinition中,看他的深层方法可以知道
mergedBeanDefinitions 中存放的是beanName 和 父beanDefinitions的映射
RootBeanDefinition是定义出来的一个子beanDefition
![](https://img-blog.csdnimg.cn/20210526212129817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
这个方法有点长
![](https://img-blog.csdnimg.cn/20210526212129886.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526212129944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210526212129903.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
这些流程只要是吧不同的 BeanDefinition实现,合并成一个 RootBeanDefinition.
对于 MergedBeanDefinition属性spring提供了响应的扩展接口 MergedBeanDefinitionPostProcessor
MergedBeanDefinition生成之后,bean属性填充之前,对该bean和该MergedBeanDefinition做一次回调