在spring实例化 之前bean对象封装成 beanDefinition 对象 想了解详情的请参考上一篇文章

好了 我们聊聊 Bean 的实例化过程的几个重要角色

BeanDefinitionRegistryPostProcessor 接口

Refresh().invokeBeanFactoryPostProcessors 这个方法里面。

BeanDefinitionRegistryPostProcessor 这个接口的调用分为三部:

1、调用实现了 PriorityOrdered 排序接口

2、调用实现了 Ordered 排序接口

3、没有实现接口的调用

这个接口我的理解:获取 BeanDefinitionRegistry 对象,获取到这个对象就可以获取这个对象中注册的

所有 BeanDefinition 对象,所以我们知道了,我们拥有这个对象就可以完成里面所有 BeanDefinition 对

象的修改新增操作

java bean的实例化过程 bean的三种实例化过程_实例化

 

BeanPostProcessor 的注册

Refresh().registerBeanPostProcessors 这个方法里面。

java bean的实例化过程 bean的三种实例化过程_实例化_02

拿到 BeanFactory 中所有注册的 BeanDefinition 对象的名称 beanName。

 

java bean的实例化过程 bean的三种实例化过程_实例化_03

然后判断是否实现了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是将

该 ppName 对应的 BeanDefinition 对象实例化。

java bean的实例化过程 bean的三种实例化过程_spring_04

把对应的 BeanPostProcessor 对象注册到 BeanFactory 中,BeanFactory 中有一个

list 容器接收。

getSingleton 方法

代码位置:

AbstractBeanFactory.doGetBean 方法中

 

java bean的实例化过程 bean的三种实例化过程_spring_05

 

 

方法里面核心要点:

java bean的实例化过程 bean的三种实例化过程_实例化_06

 

 

java bean的实例化过程 bean的三种实例化过程_spring_07

把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在这个集合里

面的 bean 都是正在实例化的 bean,就是实例化还没做完的 BeanName

java bean的实例化过程 bean的三种实例化过程_spring_08

调到 getObject 方法,完成 bean 的实例化。接下来

java bean的实例化过程 bean的三种实例化过程_java bean的实例化过程_09

 

 

getObject 调用完后,就代表着 Bean 实例化已经完成了,这时候就需要

1、singletonsCurrentlyInCreation 把 beanName 从这个集合中删除

2、addSingleton,把 bean 缓存到一级缓存中

java bean的实例化过程 bean的三种实例化过程_实例化_10

createBean 方法

代码位置:

AbstractBeanFactory.doGetBean 方法中

java bean的实例化过程 bean的三种实例化过程_java bean的实例化过程_11

 

这个方法是 bean 实例化核心方法

 

java bean的实例化过程 bean的三种实例化过程_构造函数_12

 

 

实例化方法,把 bean 实例化,并且包装成 BeanWrapper

点进这个方法里面。

java bean的实例化过程 bean的三种实例化过程_spring_13

 

 

这个方法是反射调用类中的 factoryMethod 方法。这要知道@Bean 方法的原理,实际上

spring 会扫描有@bean 注解的方法,然后把方法名称设置到 BeanDefinition 的 factoryMethod

属性中,接下来就会调到上面截图中的方法实现@Bean 方法的调用。该方法里面的参数解

析过程不需要了解。

java bean的实例化过程 bean的三种实例化过程_java bean的实例化过程_14

 

 

determineConstructorsFromBeanPostProcessors

这个方法是 BeanPostProcessor 接口类的首次应用,最终会掉到

AutowiredAnnotationBeanPostProcessor 类的方法,在方法中会扫描有注解的构造函数然后完

成装配过程。