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

news2025/1/12 8:57:46

文章目录

    • 前述
    • 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.coloradmin.cn/o/2131202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:命令行参数

目录 一、命令行参数是什么? 二、命令行参数作用 三、命令行参数如何传递给main函数? 一、命令行参数是什么? C语言中的main函数,我们发现既可以带参数,也可以不带参数。带参数的main函数如下: 参数为一…

Matplotlib - Statistical Distribution作图

1. 前言 在数据分析和统计学中,绘制统计分布图是非常重要的,因为它帮助我们直观地理解数据的特性,并为进一步的分析提供基础。统计分布图能够揭示数据集的结构、趋势、集中趋势和离散程度等信息,从而使我们更容易做出合理的假设、…

监控系统添加vcenter上的esxi主机

监控系统的软件选择: 监控系统要求 快速搭建 能快捷地添加vcenter上的主机(esxi) 能实现动态添加主机监控 可供选择的监控软件 Prometheus vmware_exporter添加 vcenter及esxi监控,报奇怪的错误,解决时间比较长&a…

高阶数据结构之哈希表基础讲解与模拟实现

程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高阶编程—>x语言的科学与艺术—>编程之美—>编程之道—>编程之禅—>颈椎病康复指南。 前言: 哈希表(Hash Table)是一种高效的键值对存储数据结构&…

C++(进阶) ─── 继承

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟继承 8.继…

ARCGIS PRO DSK MapTool

MapTool用于自定义地图操作工具,使用户能够在ArcGIS Pro中执行特定的地图交互操作。添加 打开MapTool1.vb文件,可以看到系统已经放出MapTool1类: Public Sub New()将 IsSketchTool 设置为 true 以使此属性生效IsSketchTool TrueSketchTyp…

秋招测评为什么有行测题型?有没有训练题库?

为什么有行测题型,那这就得看看行测题型的作用了。 1、行测题可以比较全面评估应聘者的基本素质,包括数学能力、语言能力、逻辑思维能力等。这些能力是从事各类职业所必需的基本能力,对于判断应聘者的学习潜力和工作效率具有重要意义。 2、…

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…

如何准备多台虚拟机并配置集群化软件

在搭建集群化软件的过程中,首先需要准备好多台Linux服务器。本文将详细介绍如何使用VMware提供的克隆功能来准备多台虚拟机,并进行必要的配置以实现集群化软件的部署。 1. 准备多台虚拟机 安装集群化软件,首要条件就是要有多台Linux服务器可…

nvm无法下载npm的问题

1、问题 执行 nvm install 14.21.3 命令,node可以正常下载成功,npm下载失败 2、nvm配置信息 …/nvm/settings.txt root: D:\soft\nvm path: D:\soft\nodejs node_mirror: npmmirror.com/mirrors/node/ npm_mirror: registry.npmmirror.com/mirrors/…

Java面试篇基础部分-Java内部类介绍

首先需要了解什么是内部类,内部类就是定义在类的内部的类称为内部类,内部类可以根据不同的定义方式分为静态内部类、成员内部类、局部内部类和匿名内部类。 静态内部类 定义在类体内部的通过static关键字修饰的类,被称为静态内部类。静态内部类可以访问外部类的静态变量和…

BEV学习---LSS-3--(体素坐标系及各种坐标系的理解)

1、体素坐标系 如下两个链接,详细介绍了对体素坐标系的理解: 体素坐标(voxel_coors)在mmdetection3d中的理解_体素坐标系-CSDN博客 3D目标检测中坐标系详解_点云用的什么坐标系-CSDN博客 2、自动驾驶中各种坐标系的定义及相互转换 【KnowledgeBase】…

lamp和nginx的搭建

lamp搭建 下载需要用到的 yum install php yum install php-mysql yum install php-mbstring 进入到html路径下,将文件复制到该路径 解压文件 将文件夹里的内容都复制到html下 在配置文件中添加页面index.php 此时打开网页提示需添加可写权限 但因为直接添加不…

Java实现发送邮件如何配置SMTP和认证信息?

Java实现发送邮件的关键要点?Java怎么实现邮件发送? Java作为一种强大的编程语言,提供了丰富的库和工具来实现邮件发送功能。AokSend将详细介绍如何在Java中配置SMTP服务器和认证信息,以实现邮件发送功能。 Java实现发送邮件&am…

企业级镜像容器的访问控制

为保障镜像制品及企业版实例安全,需要配置公网的访问控制策略,以限制通过公网访问企业版实例。 ps: 本功能只能在企业版实例使用,对于个人版实例不支持使用此功能。 操作步骤 1、登录容器镜像控制台 ; 2、在顶部菜单栏&#xf…

鱼类检测-目标检测数据集(包括VOC格式、YOLO格式)

鱼类检测-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接:https://pan.baidu.com/s/1B4o8IgOmAWeQJDWpJWxqXg?pwdjaco 提取码:jaco 数据集信息介绍: 共有 2848 张图像和一一对应的标注文件 标注文…

[图论]街道赛跑

题目描述 图一表示一次街道赛跑的跑道。可以看出有一些路口(用 0 0 0 到 N N N 的整数标号),和连接这些路口的箭头。路口 0 0 0 是跑道的起点,路口 N N N 是跑道的终点。箭头表示单行道。运动员们可以顺着街道从一个路口移动到…

自测的重要性

1、把debug一遍,看看每一步变量值的变化都符合预期 2、核对需求文档,看看是不是自己的逻辑跟需求都是匹配的,有没有遗漏的细节 3、有时候配合接口的使用方去做点假数据,也是发现自己接口漏洞的好机会 发现了sql少写了个条件、发…

【Go】Go语言中的流程控制语句

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Python识别拖放的PDF文件再转成文本文件

日常工作中经常用到PDF文件,有些PDF文件的文字是不能复制的,为了复制这些文字,我们需要转化PDF文件,或者采用微信的OCR图片识别文字,这样非常不方便。为此,我编写了一个Python小程序,利用Tkinte…