Spring bean对象实例化实现过程图解

所属分类: 软件编程 / java 阅读数: 101
收藏 0 赞 0 分享

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

BeanDefinitionRegistryPostProcessor 接口

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

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

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

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

3、没有实现接口的调用

这个接口我的理解:获取 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 实例化已经完成了,这时候就需要

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

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

createBean

方法代码位置:AbstractBeanFactory.doGetBean 方法中

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

实例化方法,把 bean 实例化,并且包装成 BeanWrapper点进这个方法里面。

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

determineConstructorsFromBeanPostProcessors

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java基于反射机制实现全部注解获取的方法示例

这篇文章主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 信号量Semaphore的实现

这篇文章主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

eclipse+maven+spring mvc项目基本搭建过程

这篇文章主要介绍了eclipse+maven+spring mvc项目基本搭建过程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring boot集成swagger2生成接口文档的全过程

这篇文章主要给大家介绍了关于Spring boot集成swagger2生成接口文档的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java冒泡排序法和选择排序法的实现

这篇文章主要介绍了Java冒泡排序法和选择排序法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring Cloud Alibaba教程之Sentinel的使用

这篇文章主要介绍了Spring Cloud Alibaba教程之Sentinel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Josephus环的四种解法(约瑟夫环)基于java详解

这篇文章主要介绍了Josephus环的四种解法(约瑟夫环)基于java详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java继承Thread类创建线程类示例

这篇文章主要介绍了Java继承Thread类创建线程类,结合实例形式分析了java线程操作相关使用技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java使用Callable和Future创建线程操作示例

这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

springBoot使用JdbcTemplate代码实例

这篇文章主要介绍了springBoot使用JdbcTemplate代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多