BeanFactory 是什么?它与 ApplicationContext 有什么区别?
谈到Spring,那势必要讲讲容器 BeanFactory 和 ApplicationContext。
BeanFactory是什么?
BeanFactory,其实就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此时又有初学的小伙伴会问:Bean 是什么?其实这就是对象,只不过这个对象是被 Spring Ioc 容器管理的。
BeanFactory 的主要功能
1. 创建 Bean
BeanFactory
负责创建和管理 Bean 的生命周期。简单来说,它就像是一个工厂,负责生产(创建)各种对象(Bean)。这些对象在创建时,BeanFactory
会根据配置文件(如 XML 文件)中的定义,初始化这些对象的属性和行为。
2. 依赖注入
BeanFactory
通过依赖注入(DI)机制将依赖关系注入到 Bean 中。想象一下,一个对象(Bean)需要使用另一个对象(依赖)来完成某些任务。BeanFactory
会自动将这些依赖对象注入到需要它们的 Bean 中,这样你就不需要在代码中手动创建这些依赖对象,使得代码更加简洁和易于维护。
3. 获取 Bean
BeanFactory
提供了方法来获取 Bean 实例。当你需要使用某个 Bean 时,你可以通过 BeanFactory
提供的方法(如 getBean
)来获取这个 Bean 的实例。这个过程就像是从工厂中取出一个已经生产好的产品一样简单。
下面举一个例子:通过 BeanFactory 获取所有的单例 Bean。
@SpringBootApplication
public class Application {public static void main(String[] args) {// 启动 Spring 应用ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);// 通过反射获取 DefaultSingletonBeanRegistry 类中的 singletonObjects 字段Field singletonObjectsField;try {singletonObjectsField = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");singletonObjectsField.setAccessible(true);// 获取当前 Spring 容器的 BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();// 通过反射获取 singletonObjects 字段的值Map<String, Object> singletonObjects = (Map<String, Object>) singletonObjectsField.get(beanFactory);// 打印所有单例 BeansingletonObjects.forEach((beanName, beanInstance) -> {System.out.println(beanName + ": " + beanInstance.getClass().getName());});} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}// 关闭 Spring 容器context.close();}
}
另外,需要自己提前创建好 bean。方法有很多,简便点,直接加类上加 @Component 即可,这使得该类可以被 Spring 容器自动检测并注册为一个 Bean。如下所示:
@Component
public class MyComponent {public void doSomething() {System.out.println("Doing something...");}
}
那它与 ApplicationContext 有什么区别?
可以从图中看出,ApplicationContext
可以说是更高级的容器,它继承并扩展了 BeanFactory
的功能,提供了更多的功能。具体来说,ApplicationContext
多继承了以下几个接口:
-
MessageSource
:提供国际化消息支持,可以用于多语言应用。 -
EnvironmentCapable
:提供环境变量的访问功能,可以获取系统环境变量和配置文件中的属性。 -
ResourcePatternResolver
:提供资源路径解析功能,可以方便地加载资源文件。 -
ApplicationEventPublisher
:提供事件发布功能,可以发布和监听应用事件。
总结
BeanFactory
:是最基本的 Spring 容器接口,提供 Bean 的创建、配置和组装功能。适用于资源受限的环境,启动速度快。
ApplicationContext
:是 BeanFactory
的子接口,提供了更多的高级功能,如事件传播、国际化消息支持、资源访问等。适用于大多数企业级应用,启动时会自动初始化所有单例 Bean,提供更多的功能和便利性。
相关文章:

BeanFactory 是什么?它与 ApplicationContext 有什么区别?
谈到Spring,那势必要讲讲容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么? BeanFactory,其实就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此时又有初学的小伙伴会问:Bean 是什么&#x…...

虚幻基础-1:cpu挑选(14600kf)
能帮到你的话,就给个赞吧 😘 文章目录 ue非常吃cpu拉满主频打开项目编写蓝图运行原因 时间长 关于压力测试 本文以14600kf为例,双12购入,7月份产。 ue非常吃cpu 经本人测试,ue是非常吃cpu的。 拉满主频 无论任何时间…...
多种vue前端框架介绍
学如逆水行舟,不进则退。 在现今的软件开发领域,Vue.js凭借其高效、灵活和易于上手的特性,成为了前端开发的热门选择。对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的Vue后台管理系统模板无疑是一个明智之举。 本文…...

jenkins-node节点配置
一.简述: Jenkins有一个很强大的功能: 即:支持分布式构建(jenkins配置中叫节点(node),也被称为slave)。分布式构建通常是用来吸收额外的负载。通过动态添加额外的机器应对构建作业中的高峰期,或在特定操作系统或环境运行特定的构建…...

计算机网络 (50)两类密码体制
前言 计算机网络中的两类密码体制主要包括对称密钥密码体制(也称为私钥密码体制、对称密码体制)和公钥密码体制(也称为非对称密码体制、公开密钥加密技术)。 一、对称密钥密码体制 定义: 对称密钥密码体制是一种传…...

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库&…...

计算机网络-概述
目录 一.互联网 1.0简介 1.1互联网发展的三个阶段 1.2互联网组成 1.2.1 简介 1.2.2 边缘部分 1.2.3 核心部分 1.3计算机网络类别 1.3.1按照范围分类 1.3.2按使用者分类 1.3.3用来把用户接入互联网的网络 1.4计算机网络性能 1. 速率(Data Rate / Bit Ra…...

Jenkins-基于Role的鉴权机制
jenkins自带了一些全局性的安全配置。 但无法通过job等相对细粒度的来控制使用者的权限。但它可以借助相关的插件实现细颗粒的权限控制。 插件: Role-based Authorization Strategy 需要在configure global security中配置授权策略如下: 保存后&#x…...

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!
一、信道划分介质访问控制 介质访问控制:多个节点共享同一个“总线型”广播信道时,可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问,才能减少冲突,甚至避免冲突? 时分复用(TDM) 时分复用:将时间分为等长的“…...

5.若依 Configuration ConfigurationProperties 使用
1. 若依的配置文件application.yml 2. RuoYiConfig 负责读取基础配置 注意写法: ConfigurationProperties 需要配合在容器内进行读取,因此需要一般与Component注解配合。 同时要注意编写 set get方法。 总结:这里一个知识点:Co…...

使用docker部署mysql和tomcat服务器发现的问题整理
1、本地访问tomcat时访问不到 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …...

数据库开发支持服务
文章目录 前言适用产品服务范围前提条件责任矩阵交互项目 服务流程交付件项目完成标志 前言 数据库开发支持服务是为了达成客户业务系统开发、测试、上线运行提供的具体技术支撑,内容包括数据库开发指导、性能调优、第三方平台对接支持、应用对接与上线支持等。数据…...

通过学习更多样化的生成数据进行更广泛的数据分发来改进实例分割
大家读完觉得有帮助记得关注和点赞!!! 本次使用的英文整理的一些记录,练习一下为后续SCI发表论文打好基础 Improving Instance Segmentation by Learning Wider Data Distribution with More Diverse Generative Data Abstract In…...
NVIDIA视频编解码
开源了两个项目:英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装,由于官方自带的demo晦涩难懂并且每块都是独立的,我对SDK进行二次封装并形成了一套较为完整的视频编解码流程,调用简单,有完整的测…...
GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?
GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司, 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的,具体是在GCC 1.3版本中…...
详解深度学习中的Dropout
Dropout是一种在神经网络训练中常用的正则化技术,其操作是在每次训练迭代中随机“丢弃”一部分神经元(即将其输出置为零)。以下是对这一操作的详细解释: 一、基本思想 Dropout的基本思想是减少神经元之间的复杂共适应关系&#…...
SQL-杂记1
PIVOT的使用: 行转列IIF()的使用:IIF( boolean_expression, true_value, false_value)多个字段使用MX()函数 SELECTD.ID,字段1,字段2,字段3,字段4,字段5,X.MinDateValue FROM 表名 D WITH(NOLOCK) OUTER APPLY (SELECT MIN(DateValue) AS MinDateValueFROM (VALUES (字段1),(字…...

Python(十七)excel指定列自动翻译成英文
前言 本章主要讲述在excel的指定列后面添加一列,并翻译成英文 一、效果图 二、代码 实际需求: # -*- codeing utf-8 -*- # time: 2025/1/16 16:32 # Author : Mikasa # # Aim:自动将客户发的货物清单里的商品名称,翻译成英文…...

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示
Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力…...

诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录
问题 一个非常常规的Spring Controller,代码如下: import lombok.RequiredArgsConstructor;Slf4j RestController RequiredArgsConstructor RequestMapping("/api/v1/config") public class ConfigController {private final ConfigService …...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...