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,一经查实,立即删除!

相关文章

python实现pdf转word和excel

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

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;我们将专注…

运行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,包含…

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的模型讲解将…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置

下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…

wx030基于springboot+vue+uniapp的养老院系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…