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

文章目录

    • 前述
    • 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.rhkb.cn/news/426342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s证书过期处理

证书一共分为 根CA(ca.crt) master各组件的证书(包括etcd、apiserver、front-proxy、controller-manager等各种) kubelet证书 k8s证书有效期说明: 1、原生版本有效期master节点: /etc/kubernetes/ssl/…

YOLOv10改进系列,YOLOv10损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点

改进前训练结果: 改进后的结果: 摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针…

基于 K8S kubernetes 的常见日志收集方案

目录 1、日志对我们来说到底重不重要? 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么? 3.3 Filebeat工作原理 3.4 …

ELFK日志分析平台,架构和通信

整个架构,加上跳板机,总共12台机器 技术方案: 1. 配置nfs服务器,为web集群提供共享网络文件系统 # 部署 NFS 服务 [rootnfs ~]# dnf install -y nfs-utils [rootnfs ~]# vim /etc/exports /var/webroot 192.168.1.0/24(rw,…

xml重点笔记(尚学堂 3h)

XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…

剖析 MySQL 数据库连接池(C++版)

目录 ☀️0. 前言 🌤️1. 数据库连接池概述 ⛅1.1 服务器与数据库交互 ⛅1.2 MySQL 数据库网络模型 ⛅1.3 MySQL 连接驱动安装 ⛅1.4 同步(synchronous)连接池与异步(asynchronous)连接池 ⛅1.5 同步连接池和异…

记录开发一个英语听力训练网站

背景 在当前全球经济衰退的背景下,IT相关的工作在国内的竞争也是越来越激烈,为了能够获得更多的可能性,英语的学习也许能为程序员打开一扇新的窗户,比如很多远程的工作尤其是国际化背景的工作团队,英语的协作沟通是必…

yolov8-obb中存在的一个bug

yolov8支持OBB目标检测,且能提供较好的性能。 但是最近在使用yolov8-obb的过程中,发现yolov8-obb存在一个bug。即训练数据如果包含不带旋转角度的水平目标时,训练出的模型,经常会输出垂直的检测框,需要旋转90度以后才能得到最终结果。把yolov8-obb相关的源码阅读一遍才发…

初始爬虫5

响应码: 数据处理: re模块(正则表达式) re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明: 1. 基本用法 1.1 匹配模式 …

STM32 的 RTC(实时时钟)详解

目录 一、引言 二、RTC 概述 三、RTC 的工作原理 1.时钟源 2.计数器 3.闹钟功能 4.备份寄存器 四、RTC 寄存器 1.RTC_TR(Time Register,时间寄存器) 2.RTC_DR(Date Register,日期寄存器) 3.RTC_S…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

如何简化机器人模型,加速仿真计算与可视化

通常,我们希望将自己设计的机器人模型导入仿真环境。由于是通过 CAD 软件设计的,导出的 urdf 使用 STL 或 DAE 文件来表示 3D 几何。但原始的 STL 或 DAE 文件通常过于复杂(由数十万个三角面片组成),这会减慢仿真速度,有时也会导致仿真软件报错(如Webots)。为了在正确描述…

【Linux】调试和Git及进度条实现

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:Linux入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1.…

KVM创建的虚拟机无法访问外网

基础环境如下: [rootlocalhost ~]# virsh domifaddr CentOS7_YFName MAC address Protocol Address -------------------------------------------------------------------------------vnet0 52:54:00:cb:a6:0d ipv4 192.168.…

Java中的事务管理

1.1 事务管理 1.1 事务回顾 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。 怎么样来控制这组操作,让这组操…

OpenCV高阶操作

在图像处理与计算机视觉领域,OpenCV(Open Source Computer Vision Library)无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下,采样 下采样(Downsampling) 下采样通常用于减小图像的…

RabbitMQ(高阶使用)延时任务

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 1. 什么是延时任务? 1.1 和定时任务区别 2. 延时队列使用场景 3. 常见方案 3.1 数据库轮询 优点 缺点 3.2 JDK的延迟队列 优点 缺点 3.3 netty时间轮算法 优点 缺点 3.4 使用消息…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式(传统蓝牙),另一种是通过GATT(BLE蓝牙)。与传统蓝牙相比,BLE 旨在大幅降低功耗。这样…