BeanFactoryApplicationContext之间的关系

1**.BeanFactory与ApplicationContext之间的关系**

在这里插入图片描述

(1)从继承关系上来看:

​ BeanFactory它是ApplicationContext 的父接口

(2)从功能上来看:

​ BeanFactory才是spring中的核心容器,而ApplicationContext 是组合或者说是借助了(继承)了BeanFactory的功能。

1.1什么是BeanFactory?

表面上我们用到了getbean方法

实际上:IOC,DI以及Bean的生命周期的各种功能都有它的实现类提供的。

补充:

这个实现类是谁==》DefaultListableBeanFactory

在这里插入图片描述

关于DefaultListableBeanFactory

它有一个继承的接口DefaultSingletonBeanRegistry,该类的有一个成员变量用来存放单例的Bean

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

在这段代码中,singletonObjects 是一个 ConcurrentHashMap 类型的对象,它是线程安全的哈希表实现。ConcurrentHashMap 允许多个线程同时进行读取和写入操作,保证了并发访问的安全性。
该 Map 的键为字符串类型,表示 bean 的名字或唯一标识符,值为 Object 类型,表示对应的 bean 实例。通过使用键值对的方式来存储和管理 bean 实例,我们可以使用 bean 的名字作为键来快速查找和访问对应的 bean。
这是 Spring 容器内部的一个数据结构,用于存储已经创建的单例 bean 实例。当需要获取一个单例 bean 时,Spring 会首先在 singletonObjects 中查找,如果存在则直接返回,否则会创建新的实例并放入 singletonObjects 中缓存起来,以便下次使用。

标准一点回答:

BeanFactory 是 Spring 框架中的一种核心机制,用于管理和提供应用程序中的对象实例,也被称为 bean。

在 Spring 中,我们可以通过配置文件或注解定义各种 bean 对象,这些 bean 对象可以是服务、数据访问对象(DAO)、控制器等。BeanFactory 的作用是在应用程序运行时负责创建、管理和提供这些 bean 实例。

BeanFactory 主要提供以下功能:

  1. Bean 实例化:BeanFactory 负责根据配置信息或注解来实例化 bean 对象。它会根据 bean 的定义和配置信息,使用适当的实例化策略(如构造函数实例化、工厂方法实例化等)创建 bean 的实例。
  2. 依赖注入:BeanFactory 负责管理 bean 之间的依赖关系。通过配置文件或注解,我们可以声明 bean 之间的依赖关系,BeanFactory 在创建 bean 实例时自动处理这些依赖,将依赖的对象注入到需要的位置。
  3. 生命周期管理:BeanFactory 管理 bean 的生命周期。它负责调用 bean 的初始化方法和销毁方法(如果定义了的话)。
  4. 懒加载:BeanFactory 支持懒加载(Lazy Initialization),即只有在需要访问 bean 时才会进行实例化。这样可以提高应用程序的性能,避免不必要的对象创建和资源占用。

BeanFactory 是 Spring 容器的核心接口,它有许多具体的实现,如 XMLBeanFactory、ApplicationContext 等。我们可以根据具体的需求选择适合的实现类来管理和获取 bean 实例。通过 BeanFactory,我们可以实现松耦合、可扩展和易于维护的应用程序架构。

MessageSource 是 Spring 框架中的一个接口,用于支持国际化和本地化的消息资源管理。

在应用程序中,我们通常需要显示用户界面上的文本消息,如错误消息、警告消息或其他用户提示信息。使用 MessageSource 接口可以帮助我们管理这些文本消息,使其能够根据不同的语言和地区进行动态的翻译和显示。

1.2 ApplicationContext

在这里插入图片描述

从类图上来看ApplicationContext继承除BeanFactory的两个子接口还继承了其余四个接口来扩展功能

MessageSource, ApplicationEventPublisher, ResourcePatternResolver,EnvironmentCapable

MessageSource 提供了以下主要功能:

  1. 获取消息:通过调用 getMessage() 方法,我们可以根据给定的消息代码和可选的参数从消息源中获取相应的文本消息。这个方法基于当前的语言环境(Locale)自动选择适当的消息。
  2. 多语言支持:MessageSource 支持多语言的消息资源管理。我们可以为每个支持的语言和地区提供对应的消息资源文件,其中包含了相同的消息代码但是具有不同的翻译内容。根据当前的语言环境,MessageSource 可以自动选择正确的消息资源文件来获取对应的翻译文本。
  3. 占位符和参数化消息:MessageSource 支持在消息文本中使用占位符和参数化的消息。我们可以在消息文本中使用占位符,然后通过传递参数来实现动态替换。这样可以更灵活地构建消息,适应不同的上下文和需求。

通过使用 MessageSource,我们可以实现应用程序的国际化,使其能够适应不同语言和地区的用户。它提供了一种方便和可扩展的方式来管理和显示多语言的文本消息。

ApplicationEventPublisher是Spring框架中的一个接口,用于在应用程序中发布事件,并通知所有已注册的事件监听器。

主要功能:

它的主要作用是实现应用程序中不同组件之间的解耦。当某个组件或模块执行某个重要操作时,它可以使用ApplicationEventPublisher来发布相关事件,而不需要直接调用其他组件或模块的方法。这样,该组件与其他组件的关系变得松散,提高了代码的可维护性和可扩展性。

简单地从理解层面来说:

ApplicationEventPublisher用于发布事件消息给对该事件感兴趣的监听者。

具体来说,当某个事件发生时,比如订单下单事件,在相应的代码逻辑执行完成后,使用ApplicationEventPublisher可以将该事件发布出去。发布事件的动作将会触发所有对该事件感兴趣的监听器进行相应的处理。

监听器负责订阅(注册)所关心的事件,并在事件发生时执行特定的逻辑。通过监听器的注册和事件的发布,实现了模块或组件之间的解耦。发布者只需要关心事件的发布,而具体的处理逻辑则由监听器来实现。

简而言之,ApplicationEventPublisher是用来发布事件消息的,它负责将事件通知传递给对该事件感兴趣的监听者。这样,监听者就可以根据自己的需求来订阅并处理相应事件,实现系统的解耦和灵活性。

ResourcePatternResolver是Spring框架中的接口,用于解析资源路径模式并获取匹配的资源。

ResourcePatternResolver的主要作用是根据指定的资源路径模式,获取匹配的资源。资源可以是文件、类路径下的资源或者其他可访问的资源。它扩展了ResourceLoader接口,提供了更灵活的资源加载和解析功能。

通过ResourcePatternResolver,可以使用通配符和模式匹配的方式获取一组符合条件的资源。这在很多场景下非常有用,例如:

  1. 批量加载资源:当需要加载多个资源时,可以使用资源路径模式来批量获取符合条件的资源,而不需要逐个指定资源路径。
  2. 动态加载资源:资源路径模式可以在运行时动态地构建,以满足特定需求。这样可以使系统更具灵活性和可扩展性。
  3. 配置文件加载:通过配置文件指定资源路径模式,可以方便地加载配置文件所在的目录下的所有符合条件的资源。

举个例子,假设我们有一个Spring项目,需要加载所有类路径下以.xml为后缀的配置文件。使用ResourcePatternResolver,我们可以定义一个资源路径模式类似于classpath*:**/*.xml,然后调用相应方法来获取所有匹配的配置文件资源。

总之,ResourcePatternResolver提供了一种便捷的方式来根据资源路径模式获取匹配的资源,使得资源加载更加灵活和可配置。使用它可以简化代码,提高系统的可扩展性和可维护性。

EnvironmentCapable是Spring框架中的一个接口,用于表示实现该接口的对象具有获取运行环境(Environment)的能力。

通过实现EnvironmentCapable接口,可以让对象获取当前应用程序的运行环境。运行环境包括了一些与应用程序相关的配置和属性信息,比如操作系统信息、系统属性、环境变量等。

EnvironmentCapable接口主要定义了一个方法:

Environment getEnvironment();

该方法返回一个Environment对象,通过该对象可以获取当前运行环境的各种属性和配置值。

EnvironmentCapable的作用是使对象能够根据运行环境的不同来适应性地执行逻辑。例如,根据当前环境的配置信息,可以进行相应的初始化、配置加载或其他操作。

在Spring框架中,很多核心组件都实现了EnvironmentCapable接口,以便根据不同的运行环境进行适配和处理。比如ApplicationContext就是EnvironmentCapable的子接口之一,它可以获取运行环境并进行相应的Bean加载和管理。

件都实现了EnvironmentCapable接口,以便根据不同的运行环境进行适配和处理。比如ApplicationContext就是EnvironmentCapable的子接口之一,它可以获取运行环境并进行相应的Bean加载和管理。

总结起来,EnvironmentCapable接口提供了获取运行环境的能力,可以让对象根据不同的环境进行适应性的操作。它在Spring框架中被广泛使用,以便实现灵活的配置和适配。

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

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

相关文章

设备管理是什么意思?

设备管理 使组织能够管理和维护设备&#xff0c;包括虚拟机、物理计算机、移动设备和 IoT 设备。 设备管理是任何组织安全策略的关键组成部分。 它有助于确保设备安全、最新且符合组织策略&#xff0c;目的是保护公司网络和数据免受未经授权的访问。 由于组织支持远程和混合员…

MySQL 奇遇记三则

公司新项目&#xff0c;要使用 MySQL 数据库。 第一次使用 MySQL&#xff0c;有点小激动。听说过 N 多次&#xff0c;这一次终于用上了。 为什么是奇遇记&#xff1f; 因为在网上几乎搜索不到别人遇到和我一样的问题。 系统 &#xff1a;WINDOWS10X64 中文版 数据库&#xf…

【数学建模】-- 数学规划模型

概述&#xff1a; 什么是数学规划&#xff1f; 数学建模中的数学规划是指利用数学方法和技巧对问题进行数学建模&#xff0c;并通过数学规划模型求解最优解的过程。数学规划是一种数学优化方法&#xff0c;旨在找到使目标函数达到最大值或最小值的变量取值&#xff0c;同时满足…

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上&#xff0c;为了设计深层神经网络&#xff0c;牛津大学设计了VGG网络,采用块的设计理念&#xff0c;将AlexNet中多个重复的卷积层和池化层组成一个块 论文中&#xff0c;使用3x3卷积核&#xff0c;padding1的卷积层 和带有2x2的汇…

1046:判断一个数能否同时被3和5整除

【题目描述】 判断一个数n 能否同时被3和5整除&#xff0c;如果能同时被3和5整除输出YES&#xff0c;否则输出NO。 【输入】 输入一行&#xff0c;包含一个整数n。&#xff08; -1,000,000 < n < 1,000,000&#xff09; 【输出】 输出一行&#xff0c;如果能同时被3…

WebMagic - 创意前端项目集合(点击链接可在电脑上查看效果)

WebMagic - 创意前端项目集合 欢迎来到 WebMagic 仓库&#xff01;这里汇集了一系列令人惊叹的前端项目&#xff0c;涵盖了HTML5、CSS3和JS等多项技术。无论你是前端开发者、设计师&#xff0c;还是对创意互动内容感兴趣的人&#xff0c;这个仓库都将为你带来无尽的惊喜。 每…

Java Vue 前后端 关于时间格式数据的处理方法

前端使用 elment-ui 组件 el-date-picker 其中组件需要格式化时间&#xff0c;增加属性 value-format"yyyy-MM-dd" 后端 Java 接收参数类型 后端Dto 使用Date接收&#xff0c;并添加JsonFormat注解 JsonFormat(pattern"yyyy-MM-dd") private Date testTi…

Python比较两个Cookie之间的差异

python如何比较两个cookie字符串之间的差异 pip安装&#xff1a; pip install datedays 代码&#xff1a; cookie1 JSESSIONID123456789; key1jiuliang; key22023; key31538; cookie2 JSESSIONID123456789; key1jiuliang; key40818; print(datedays.cookie_difference(…

LangChain手记 Chains

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Chains&#xff08;源代码可见&#xff09; Chains 直译链&#xff0c;表达的意思更像是对话链&#xff0c;对话链的背后是思维链 LLM Chain&#xff08;LLM链&#xff09; 首先介绍了一个最简单的例子&#xff0c…

代码审计-java项目-组件漏洞审计

代码审计必备知识点&#xff1a; 1、代码审计开始前准备&#xff1a; 环境搭建使用&#xff0c;工具插件安装使用&#xff0c;掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集&#xff1a; 审计目标的程序名&#xff0c;版本&#xff0c;当前环境(系统,中间件…

图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…

Java二分法查找

二分法&#xff1a;首先需要一个由小到大排序好的数组&#xff0c;先找到其中间值&#xff0c;然后进行比较如果比较中间值大的话则向前找。如果比要找的小&#xff0c;则向后找。 代码实现&#xff1a; //定义查询方法 public static int searchTarget(int[] nums, int targ…

wireshark界面内容含义

网络分析工具——WireShark的使用&#xff08;超详细&#xff09;_世间繁华梦一出的博客-CSDN博客 wireshark抓包数据&#xff1a;理解与分析_wireshark里面length_ 佚名的博客-CSDN博客

【图书推荐 | 测试】—《测试设计思想》

前言 随着科技的不断发展&#xff0c;互联网的不断进步&#xff0c;日益出现了一种趋势&#xff1a;测试设计将成为一种跨领域的综合性工作&#xff0c;测试者将成为一种跨领域的通用型人才。由此清华大学出版社推出了一本名为《测试设计思想》的书籍&#xff0c;由知名专家周…

PHP-FPM进程排查

1、查看php-fpm的进程个数 ps -ef |grep "php-fpm"|grep "pool"|wc -l2、查看每个php-fpm占用的内存大小 ps -ylC php-fpm --sort:rss3.查看PHP-FPM在你的机器上的平均内存占用 ps --no-headers -o "rss,cmd" -C php-fpm | awk { sum$1 } END…

防止 JavaScript 中的正则表达式回溯

防止 JavaScript 中的正则表达式回溯 正则表达式是用于在软件应用程序中操作和验证文本的强大工具。然而&#xff0c;某些正则表达式模式可能容易受到回溯的影响&#xff0c;这可能会导致超线性运行时&#xff0c;并可能导致DoS攻击。在本文中&#xff0c;我们将探讨什么是回溯…

ios swift5 collectionView 瀑布流(两列)

文章目录 1.瀑布流1.1 demo地址1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和文字的高度 1.瀑布流 1.1 demo地址 CollectionViewWaterfallLayout - github 1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和…

产业园区数字孪生3d可视化全景展示方案

随着数字经济的发展&#xff0c;数字技术给企业发展带来了机遇的同时&#xff0c;也为企业管理带来挑战。比如园区运维&#xff0c;不仅体量大&#xff0c;复杂的运维管理系统&#xff0c;落地难度也较高。那么如何通过数字化手段重塑园区运营&#xff0c;打通园区各业务数据孤…

SQLyog中导入CSV文件入库到MySQL中

1.在数据库中新建一个表&#xff0c;设置列名&#xff08;与待导入文件一致&#xff09;&#xff0c;字段可以多出几个都可以 2.右键表名&#xff0c;导入- - >导入使用本地加载的CSV数据 选择使用加载本地CVS数据 3.指定好转义字符&#xff0c;将终止设置为,号(英文状态下…

idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵

问题一&#xff1a;全局搜索快捷键ctrlshiftf 突然失灵了&#xff0c;键盘敲烂了 都没反应&#xff0c;这是为什么呢&#xff1f; 肯定不是idea本身的原因&#xff0c;那么就是其它外在因素影响到了idea的快捷键&#xff0c;那么其它的快捷键为什么没失效呢&#xff0c;原因只有…