在spring实例化 以前bean对象封装成 beanDefinition 对象 想了解详情的请参考上一篇文章html
好了 咱们聊聊 Bean 的实例化过程的几个重要角色
BeanDefinitionRegistryPostProcessor 接口
Refresh().invokeBeanFactoryPostProcessors 这个方法里面。
BeanDefinitionRegistryPostProcessor 这个接口的调用分为三部:
一、调用实现了 PriorityOrdered 排序接口
二、调用实现了 Ordered 排序接口
三、没有实现接口的调用
这个接口个人理解:获取 BeanDefinitionRegistry 对象,获取到这个对象就能够获取这个对象中注册的
全部 BeanDefinition 对象,因此咱们知道了,咱们拥有这个对象就能够完成里面全部 BeanDefinition 对
象的修改新增操做
BeanPostProcessor 的注册
Refresh().registerBeanPostProcessors 这个方法里面。
拿到 BeanFactory 中全部注册的 BeanDefinition 对象的名称 beanName。
而后判断是否实现了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是将
该 ppName 对应的 BeanDefinition 对象实例化。
把对应的 BeanPostProcessor 对象注册到 BeanFactory 中,BeanFactory 中有一个
list 容器接收。
getSingleton 方法
代码位置:
AbstractBeanFactory.doGetBean 方法中
方法里面核心要点:

把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在这个集合里
面的 bean 都是正在实例化的 bean,就是实例化还没作完的 BeanName
调到 getObject 方法,完成 bean 的实例化。接下来
getObject 调用完后,就表明着 Bean 实例化已经完成了,这时候就须要
一、singletonsCurrentlyInCreation 把 beanName 从这个集合中删除
二、addSingleton,把 bean 缓存到一级缓存中
createBean 方法
代码位置:
AbstractBeanFactory.doGetBean 方法中
这个方法是 bean 实例化核心方法

实例化方法,把 bean 实例化,而且包装成 BeanWrapper
点进这个方法里面。
这个方法是反射调用类中的 factoryMethod 方法。这要知道@Bean 方法的原理,实际上
spring 会扫描有@bean 注解的方法,而后把方法名称设置到 BeanDefinition 的 factoryMethod
属性中,接下来就会调到上面截图中的方法实现@Bean 方法的调用。该方法里面的参数解
析过程不须要了解。
determineConstructorsFromBeanPostProcessors
这个方法是 BeanPostProcessor 接口类的首次应用,最终会掉到
AutowiredAnnotationBeanPostProcessor 类的方法,在方法中会扫描有注解的构造函数而后完
成装配过程。