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,提供更多的功能和便利性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66429.shtml

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

相关文章

【深度学习】Huber Loss详解

文章目录 1. Huber Loss 原理详解2. Pytorch 代码详解3.与 MSELoss、MAELoss 区别及各自优缺点3.1 MSELoss 均方误差损失3.2 MAELoss 平均绝对误差损失3.3 Huber Loss 4. 总结4.1 优化平滑4.2 梯度较好4.3 为什么说 MSE 是平滑的 1. Huber Loss 原理详解 Huber Loss 是一种结合…

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…

【PyCharm】连接Jupyter Notebook

【PyCharm】相关链接 【PyCharm】连接 Git【PyCharm】连接Jupyter Notebook【PyCharm】快捷键使用【PyCharm】远程连接Linux服务器【PyCharm】设置为中文界面 【PyCharm】连接Jupyter Notebook PyCharm连接Jupyter Notebook的过程可以根据不同的需求分为 本地连接 和 远程连…

Java锁 公平锁和非公平锁 ReentrantLock() 深入源码解析

卖票问题 我们现在有五个售票员 五个线程分别卖票 卖票 ReentrantLock(); 运行后全是 a 对象获取 非公平锁缺点之一 容易出现锁饥饿 默认是使用的非公平锁 也可以传入一个 true 参数 使其变成公平锁 生活中排队讲求先来后到 视为公平 程序中的公平性也是符合请求锁的绝对…

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了&#xff0c;欢迎广大GISer朋友关注&#xff0c;一起探索GIS奥秘&#xff0c;分享GIS价值&#xff01; 本专栏以实战案例的形式&#xff0c;深入浅出地介绍了GRASS GIS的基本使用方法&#xff0c;用一个个实例讲…

企业级NoSQL数据库Redis

1.浏览器缓存过期机制 1.1 最后修改时间 last-modified 浏览器缓存机制是优化网页加载速度和减少服务器负载的重要手段。以下是关于浏览器缓存过期机制、Last-Modified 和 ETag 的详细讲解&#xff1a; 一、Last-Modified 头部 定义&#xff1a;Last-Modified 表示服务器上资源…

使用Flask和Pydantic实现参数验证

使用Flask和Pydantic实现参数验证 1 简介 Pydantic是一个用于数据验证和解析的 Python 库&#xff0c;版本2的性能有较大提升&#xff0c;很多框架使用Pydantic做数据校验。 # 官方参考文档 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

从零开始学数据库 day2 DML

从零开始学数据库&#xff1a;DML操作详解 在今天的数字化时代&#xff0c;数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用&#xff0c;还是想要管理复杂的数据&#xff0c;掌握数据库的基本操作都是至关重要的。在这篇博客中&#xff0c;我们将专注…

Java 8 Stream API

文章目录 Java 8 Stream API1. Stream2. Stream 的创建3. 常见的 Stream 操作3.1 中间操作3.2 终止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得对集合类&#xff08;如 List、Set 等&#xff09;的操作变得更加简洁和直观。Stream…

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服 根据上一步的步骤&#xff0c;已经调试了ONE API的接口&#xff0c;下面&#xff0c;我们就登陆fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 这个就是你的fastGPT后台地址&#xff0c;可以在configer文件中找到。 账号是…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

【王树森搜索引擎技术】相关性02:评价指标(AUC、正逆序比、DCG)

相关性的评价指标 Pointwise评价指标&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise评价指标&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise评价指标&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

Android 项目依赖冲突问题:Duplicate class found in modules

问题描述与处理处理 1、问题描述 plugins {id com.android.application }android {compileSdk 34defaultConfig {applicationId "com.my.dialog"minSdk 21targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.run…

计算机网络 | 什么是公网、私网、NAT?

关注&#xff1a;CodingTechWork 引言 计算机网络是现代信息社会的基石&#xff0c;而网络通信的顺畅性和安全性依赖于有效的IP地址管理和网络转换机制。在网络中&#xff0c;IP地址起到了标识设备和进行数据传输的核心作用。本文将详细讨论公网IP、私网IP以及NAT转换等网络技…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

基于 WEB 开发的汽车养护系统设计与实现

标题:基于 WEB 开发的汽车养护系统设计与实现 内容:1.摘要 本文介绍了基于 WEB 开发的汽车养护系统的设计与实现。文章首先阐述了系统的背景和目的&#xff0c;即随着汽车保有量的增加&#xff0c;汽车养护需求日益增长&#xff0c;传统的汽车养护方式已经无法满足人们的需求&…