Spring BeanFactory源码中是如何创建对象
创始人
2025-05-30 21:46:44
0

Spring BeanFactory 源码中是如何创建对象

目录

整体流程

上篇博客【 源码解析-Spring 如何从配置文件中读取文件】 中,我们聊到Spring中如何从配置中读取文件并转成BeanDefinitions 。今天我们继续来聊一下,Spring 如何基于 BeanDefinitions

加工成最终的对象。

主要的步骤和把大象装入冰箱一样,都分了三步。用我们一个简单造车的场景来比喻,这三步对应的是:

在这里插入图片描述
图1

  • 实例化 (搭建车子的外壳)
  • 属性填充 (车子里边座椅等填充)
  • 初始化 (让车子初始跑起来)

过程解析

实例化-instantiateBean

这一步大体可以理解为一个复杂的 new Student(),也就是把这个对象创建出来。通过我们记录的 对象的类型,名称等属性,对对象进行实例化。但是注意这里的 student 里属性还是空的。

这里要考虑的主要问题就是,创建的对象是单例还是多例,单例怎么办,多例怎么办等。

属性填充

属性填充的一种主要方式就是set 。setName(String name);

这里要考虑的主要问题就是 Spring 通过配置文件的那种方式进行属性的注入。比如用户注入,或是容器注入等。

初始化

初始化这里,就是比如对对象设置了一些初始化方法啥的。都会在这一步里来进行。

对象加工 BeanPostProcessor

除了上面三个步骤外,Spring 还会加入一个对象加工(BeanPostProcessor)。而这个对象加工,在初始化之前和初始化之后都有。这样可以解除掉加工代码的耦合性。

也就是我们把上边 图1 再展开一些就是这样。如图2 所示。
在这里插入图片描述

                                                                   图2

代码部分

有了上边的流程,接下来我们再代入主要的代码部分,细化下其中的步骤。如图所示。

在这里插入图片描述

这张图展示了Spring创建Bean的流程。

首先,通过读取Bean的配置信息,Spring可以知道要创建哪些对象以及如何创建这些对象。

然后,Spring会实例化这些对象,并对它们进行依赖注入,即设置它们的属性值。

接下来,Spring会对这些对象进行初始化,例如调用它们的初始化方法。

最后,Spring会返回创建的Bean实例,供应用程序使用。

在这个流程中,有一个特殊的对象加工步骤,即BeanPostProcessor。BeanPostProcessor在Bean实例化和初始化之前或之后对Bean实例进行加工,以解除加工代码的耦合性。

代码入口:

@Testpublic void test() {//1 获得Spring的工厂ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");//2 通过工厂类 获得 对象Person person = (Person) ctx.getBean("person");System.out.println("person = " + person);}

核心路径:

ctx.getBean

org.springframework.beans.factory.BeanFactory#getBean(java.lang.String)

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

这里边,我们重点提一个问题,当A对象引用B对象,B对象里也引用A对象的时候。在属性填充A对象的属性时,B对象要创建的话,B对象里还需要A对象,而A对象还没创建完?这种典型的循环引用,Spring是怎么解决的?我们下篇文章里聊

总结

Spring创建Bean的流程可以简单概括为以下几个步骤:

  1. 加载Bean的配置信息
  2. 实例化Bean
  3. 依赖注入
  4. 初始化Bean
  5. 返回Bean实例

本文介绍了 Spring BeanFactory 源码中创建对象的过程,分为实例化、属性填充和初始化三个步骤。在此基础上,介绍了对象加工的 BeanPostProcessor 这一步骤,以解除加工代码的耦合性。最后,总结了 Spring 创建 Bean 的流程,包括加载 Bean 的配置信息、实例化 Bean、依赖注入、初始化 Bean 和返回 Bean 实例。
【结尾 来自 notion AI】

上一篇:ProgressBar(进度条)

下一篇:【C6】111

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...