spring容器创建bean过程中使用到的几个factory

ops/2025/1/16 5:44:02/

文章目录

    • 前述
    • BeanFactory
    • FactoryBean
    • ObjectFactory

前述

spring我们可以理解为一个帮我们管理bean的容器,使用spring框架之前创建bean都是通过new的方式,使用spring框架之后, 我们只需要告诉spring框架我们有那些bean,它会帮我们管理这些bean,在程序启动的时候帮我们创建好,放到一个容器中,随用随取,并且维护bean整体的生命周期,它有两大特性AOP(面向切面编程)和IOC(控制反转),spring也是一个基础框架,再次基础之上还有springboot框架和springcloud框架,这些框架都是以spring框架为基础的,并在此基础上进行二次开发。

IOC:之前由我们自己来new对象,现在由spring帮我们创建对象并且来管理和控制这些对象,这就是控制反转。

AOP:一些用于跟业务逻辑无关的代码,我们可以通过aop的形式来实现,比如日志打印等,在不影响业务逻辑的情况下对方法进行增强

上述提到spring框架可以帮我们管理bean,所以spring框架在启动过程中会去创建很多bean,然后交给IOC容器,创建的过程中涉及到几个比较容易混淆的factory如下:BeanFactory,FactoryBean,ObjectFactory,下面我们来分析一下这几个Factory的区别点。

BeanFactory

BeanFactory:是一个接口,是一个bean的工厂,能够创建bean(按照bean的生命周期来创建Spring中大部分的bean实例),并提供了获取bean实例的方法。
在这里插入图片描述
准确来说它并不是单纯指spring框架中的一个接口,而是bean对象创建的整体流程,spring中bean的生命周期是一个完整的标准化流程,相对比较麻烦, 所以spring框架把这些处理bean的方法抽象出了一个接口,用它来管理和创建bean。

拓展:spring容器启动时,会创建一个BeanFactory的实例,BeanFactory的创建和初始化过程涉及多个阶段,这也是Spring IOC容器的基本组成部分,负责管理对象的定义和依赖关系。随后,BeanFactory会进一步转变为ApplicationContext,它是容器的一个更高级别的扩展,提供了更多的功能,例如国际化支持、事件传播等。在Spring中,BeanFactory的几个常见实现类包括:

  • XmlBeanFactory:一个简单的BeanFactory实现,它可以从XML文件中加载Bean定义。

  • ApplicationContext:继承自BeanFactory接口,提供了更多高级特性,如国际化、资源访问(如URL和文件系统)、事件传播等。

  • ClassPathXmlApplicationContext:从类路径下加载配置文件的ApplicationContext实现。

  • FileSystemXmlApplicationContext:从文件系统中加载配置文件的ApplicationContext实现。

  • AnnotationConfigApplicationContext:从注解中加载配置的ApplicationContext实现。

FactoryBean

FactoryBean:是一个接口,通过实现这个接口,能够自定义创建bean实例,不必按照bean的生命周期来创建bean。
在这里插入图片描述
FactoryBean是一种设计模式,它允许开发人员使用工厂方法来创建和管理bean对象,也是用来创建bean对象的,在这个接口中提供了三个方法,在Spring框架中,FactoryBean是一个特殊的bean,它可以用来创建其他bean(Diy Bean),当我们需要根据一定条件创建不同类型的bean时,使用FactoryBean可以更加灵活地进行配置和管理。

通过实现FactoryBean接口并覆盖getObject()方法,我们可以在Spring容器启动时自定义创建bean的过程,并返回所需的bean对象, 同时,FactoryBean还支持对bean的生命周期进行管理,包括初始化和销毁操作。

ObjectFactory

ObjectFactory:是一个函数式接口,用于Spring三级缓存(singletonFactories),bean实例化以后就会加入三级缓存,三级缓存是以bean name未key, 函数式接口为value,在bean完成实例化(还未进行属性赋值)后就加入到三级缓存中,进行提前曝光,方便解决单例模式的循环依赖,在循环依赖中会去获取三级缓存中的value,得到实例化的bean或者bean的代理。
在这里插入图片描述

这里注意一下对象的创分为实例化和初始化,先实例化后初始化:

  • 实例化:实例化后的Bean可以认为是半成品的Bean,为什么这么说那,因为这时候Bean对象里面的属性值都是初始值,例如String类型的值为null,int类型的值为0.
  • 初始化:Bean被初始化之后就是完整的Bean了,这时候就可直接其他对象使用了,初始化的过程也可以认为是对对象属性赋值的过程。

http://www.ppmy.cn/ops/109643.html

相关文章

比较差异 图片 视频

目录 两张图片像素差: 深度图和rgb图对齐 视频比较差异: 结构化(1行)贴到深度图上(5行): 两张图片像素差: diffnp.clip(np.abs( img_mask.astype(np.int16))-img.astype(np.int16), 0, 255).astype(np.uint8) 深度图和rgb图对…

场景感知技术带您重塑未来生活的新篇章

在科技日新月异的今天,场景感知技术正以前所未有的速度渗透到我们生活的方方面面,成为连接物理世界与数字世界的桥梁,重塑着人类的认知方式与生活体验。这项技术通过综合运用传感器、大数据分析、人工智能等前沿科技,实现对周围环…

【数据库】个人对数据库的认知和可能的演变过程

个人想法: 我说一下我对数据库的认知 刚开始的时候,我认为数据库应该是一个类似于excel的表格 后来学了编程之后呢,我觉得呀他可能是一个数组,如果内容比较多的话,他可能是一个二维数组,后来我听说数据库里…

Linux seq命令

参考资料 知っておくとちょっと便利!seq コマンドの使い方をご紹介 目录 一. 基本语法二. 选项2.1 -f 格式化输出2.2 -s 指定分隔符2.3 -w 输出数字补齐宽度 三. 小案例3.1 递减序列3.2 批量创建测试文件3.3 批量下载文件 一. 基本语法 seq [OPTION] 结束值 seq […

小样本学习+多模态

小样本学习多模态 小样本学习和多模态学习的结合是一种前沿的研究方向,主要作用是在利用少量的训练数据来学习多个模态(如文本、图像、音频、视频等)之间的关系或进行跨模态的任务。通过这种结合,模型能够在极少的样本情况下&…

C++学习,多继承

多继承,一个子类可以有多个父类,它继承了多个父类的特性。这种机制提供了强大的灵活性,但也带来了复杂性,特别是当涉及到基类中的同名成员(包括成员函数和变量)时。 C 类从多个类继承成员,语法如…

Java语言程序设计基础篇_编程练习题*18.21 (将十进制数转换为二进制数)

*18.21 (将十进制数转换为二进制数) 编写一个递归方法,将一个十进制数转换为一个二进制数的字符串。方法头如下: public static String dec2Bin(int value)编写一个测试程序,提示用户输入一个十进制数,然后显示等价的二进制数。 代码示例 …

STM32G070 CubeMX配置多通道/单通道ADC+DMA流程 LL库

基础配置不再赘述,时钟这些根据硬件来配置 多通道ADCDMA配置图: 程序配置: 调试查看内存数据,硬件上将PA1接到GND,PA2接到3V3 采集的数据会循环覆盖内存 问题:代码里先初始化ADC_IN1,再初…