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

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实例进行加工,以解除加工代码的耦合性。

代码入口:

@Test
    public 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】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值