欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

聊聊spring之bean对象的实例化过程

程序员文章站 2022-06-19 10:45:13
在spring实例化 之前bean对象封装成 beanDefinition 对象 想了解详情的请参考上一篇文章 好了 我们聊聊 Bean 的实例化过程的几个重要角色 BeanDefinitionRegistryPostProcessor 接口 Refresh().invokeBeanFactoryP ......

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

好了 我们聊聊 bean 的实例化过程的几个重要角色
beandefinitionregistrypostprocessor 接口
refresh().invokebeanfactorypostprocessors 这个方法里面。
beandefinitionregistrypostprocessor 这个接口的调用分为三部:
1、调用实现了 priorityordered 排序接口
2、调用实现了 ordered 排序接口
3、没有实现接口的调用
这个接口我的理解:获取 beandefinitionregistry 对象,获取到这个对象就可以获取这个对象中注册的
所有 beandefinition 对象,所以我们知道了,我们拥有这个对象就可以完成里面所有 beandefinition 对
象的修改新增操作
聊聊spring之bean对象的实例化过程

 

beanpostprocessor 的注册
refresh().registerbeanpostprocessors 这个方法里面。
聊聊spring之bean对象的实例化过程
拿到 beanfactory 中所有注册的 beandefinition 对象的名称 beanname。
 
聊聊spring之bean对象的实例化过程
然后判断是否实现了 priorityordered 排序接口,ordered 排序接口,getbean 是将
该 ppname 对应的 beandefinition 对象实例化。
聊聊spring之bean对象的实例化过程
把对应的 beanpostprocessor 对象注册到 beanfactory 中,beanfactory 中有一个
list 容器接收。
getsingleton 方法
代码位置:
abstractbeanfactory.dogetbean 方法中
 
聊聊spring之bean对象的实例化过程

 

 

方法里面核心要点:
聊聊spring之bean对象的实例化过程

 

 聊聊spring之bean对象的实例化过程

把 beanname 添加到 singletonscurrentlyincreation set 容器中,在这个集合里
面的 bean 都是正在实例化的 bean,就是实例化还没做完的 beanname
聊聊spring之bean对象的实例化过程
调到 getobject 方法,完成 bean 的实例化。接下来
聊聊spring之bean对象的实例化过程

 

 

getobject 调用完后,就代表着 bean 实例化已经完成了,这时候就需要
1、singletonscurrentlyincreation 把 beanname 从这个集合中删除
2、addsingleton,把 bean 缓存到一级缓存中
聊聊spring之bean对象的实例化过程
createbean 方法
代码位置:
abstractbeanfactory.dogetbean 方法中
聊聊spring之bean对象的实例化过程

 

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

 聊聊spring之bean对象的实例化过程

 

 

实例化方法,把 bean 实例化,并且包装成 beanwrapper
点进这个方法里面。
聊聊spring之bean对象的实例化过程

 

 

这个方法是反射调用类中的 factorymethod 方法。这要知道@bean 方法的原理,实际上
spring 会扫描有@bean 注解的方法,然后把方法名称设置到 beandefinition 的 factorymethod
属性中,接下来就会调到上面截图中的方法实现@bean 方法的调用。该方法里面的参数解
析过程不需要了解。
聊聊spring之bean对象的实例化过程

 

 

determineconstructorsfrombeanpostprocessors
这个方法是 beanpostprocessor 接口类的首次应用,最终会掉到
autowiredannotationbeanpostprocessor 类的方法,在方法中会扫描有注解的构造函数然后完
成装配过程。