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

 更新时间:2020年07月10日 16:16:35   作者:edda_huang  
这篇文章主要介绍了Spring bean对象实例化实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

好了 我们聊聊 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 类的方法,在方法中会扫描有注解的构造函数然后完成装配过程。

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

相关文章

  • IDEA启动Tomcat时控制台出现乱码问题及解决

    IDEA启动Tomcat时控制台出现乱码问题及解决

    这篇文章主要介绍了IDEA启动Tomcat时控制台出现乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 简述Java中的四种引用类型

    简述Java中的四种引用类型

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用,下面分别介绍下这四种引用。
    2021-04-04
  • Java将集合List转换成String字符串(或String转换成List)详解

    Java将集合List转换成String字符串(或String转换成List)详解

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,下面这篇文章主要给大家介绍了关于Java将集合List转换成String字符串(或String转换成List)的相关资料,需要的朋友可以参考下
    2023-06-06
  • 一文总结Java获取文件后缀名的所有方法

    一文总结Java获取文件后缀名的所有方法

    Java是一种应用广泛的编程语言,可以通过多种方式来实现对文件的操作,如文件名后缀、文件扩展名等,下面这篇文章主要给大家介绍了关于Java获取文件后缀名的所有方法,需要的朋友可以参考下
    2023-05-05
  • 汇总Java中List 去重的 6 种方法

    汇总Java中List 去重的 6 种方法

    这篇文章主要介绍了汇总Java中List 去重的 6 种方法,文章围绕主题展开List去重的方法,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Java 高并发二:多线程基础详细介绍

    Java 高并发二:多线程基础详细介绍

    本文主要介绍Java 高并发多线程的知识,这里整理详细的资料来解释线程的知识,有需要的学习高并发的朋友可以参考下
    2016-09-09
  • Java调用WebService服务的三种方式总结

    Java调用WebService服务的三种方式总结

    虽然WebService这个框架已经过时,但是有些公司还在使用,在调用他们的服务的时候就不得不面对各种问题,本篇文章总结了最近我调用 WebService的心路历程,3种方式可以分别尝试,需要的朋友可以参考下
    2023-08-08
  • java 自定义类比较器代码

    java 自定义类比较器代码

    这篇文章主要介绍了java 自定义类比较器代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java代码重构的几种模式详解

    Java代码重构的几种模式详解

    这篇文章详细介绍了Java代码重构的几种模式,有需要的朋友可以参考一下
    2013-10-10
  • Spring Cloud Gateway 整合 knife4j 聚合接口文档功能

    Spring Cloud Gateway 整合 knife4j 聚合接口文档功能

    这篇文章主要介绍了Spring Cloud Gateway 整合 knife4j 聚合接口文档的相关知识,我们可以基于 Spring Cloud Gateway 网关 + nacos + knife4j 对所有微服务项目的接口文档进行聚合,从而实现我们想要的文档管理功能,需要的朋友可以参考下
    2022-02-02

最新评论