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

作者:edda_huang 时间:2023-01-02 07:32:13 

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

来源:https://www.cnblogs.com/edda/p/13093617.html

标签:spring,bean,对象,实例化
0
投稿

猜你喜欢

  • 基于私钥加密公钥解密的RSA算法C#实现方法

    2022-12-01 07:52:37
  • C# listview 点击列头排序的实例

    2023-11-26 20:09:05
  • 基于jdk1.8的Java源码详解 Integer

    2023-05-08 11:32:22
  • Spring实战之XML与JavaConfig的混合配置详解

    2023-07-11 18:07:20
  • 基于Java实现Actor模型

    2021-12-11 09:28:50
  • WinForm实现为TextBox设置水印文字功能

    2023-06-09 21:15:38
  • python 转换 Javascript %u 字符串为python unicode的代码

    2022-07-28 03:15:14
  • 详解 Corba开发之Java实现Service与Client

    2023-09-23 03:42:48
  • 一篇文章带你了解java接口与继承

    2022-07-15 02:44:08
  • 详解JAVA Spring 中的事件机制

    2022-01-13 05:26:33
  • Android之RecyclerView轻松实现下拉刷新和加载更多示例

    2021-09-06 06:14:40
  • Android使用RSA加密实现接口调用时的校验功能

    2023-11-06 15:24:51
  • Java并发编程之ConcurrentLinkedQueue源码详解

    2023-01-22 16:19:51
  • 二叉树的遍历算法(详细示例分析)

    2022-08-04 02:38:35
  • jdk-logging log4j logback日志系统实现机制原理介绍

    2022-03-22 11:45:28
  • Android仿直播类app赠送礼物功能

    2023-07-26 05:06:17
  • Android ExpandableListView双层嵌套实现三级树形菜单

    2023-11-05 23:04:55
  • Android 高德地图之poi搜索功能的实现代码

    2022-03-07 01:36:52
  • Android开发之开发者头条(二)实现左滑菜单

    2022-02-28 11:18:31
  • Spring Boot统一异常处理最佳实践(拓展篇)

    2023-10-29 16:00:04
  • asp之家 软件编程 m.aspxhome.com