BeanFactoryApplicationContext之间的关系

news2024/12/26 21:38:12

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.coloradmin.cn/o/878796.html

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

相关文章

使用AffNet和HardNet进行图像匹配

一、说明 我们有一个任务是找到与给定查询图像最匹配的图像。首先&#xff0c;我们在OpenCV中尝试了使用SIFT描述符和基于Flann的匹配器的经典图像匹配。结果是完全错误的。然后是词袋...最后&#xff0c;找到了AffNet和HardNet。 二、关于AffNet和HardNet 本文专门介绍如何进…

什么是浮动(float)?如何清除浮动?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浮动&#xff08;Float&#xff09;和清除浮动⭐ 浮动的使用⭐ 清除浮动1. 空元素法&#xff08;Empty Element Method&#xff09;2. 使用 Clearfix Hack3. 使用 Overflow ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发…

《Java-SE-第三十七章》之反射

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

Selenium 测试用例编写

编写Selenium测试用例就是模拟用户在浏览器上的一系列操作&#xff0c;通过脚本来完成自动化测试。 编写测试用例的优势&#xff1a; 开源&#xff0c;免费。 支持多种浏览器 IE&#xff0c;Firefox&#xff0c;Chrome&#xff0c;Safari。 支持多平台 Windows&#xff0c;Li…

【C语言】const修饰普通变量和指针

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 一.const修饰普通变量二.const修饰指…

Spring事务控制

目录 1、什么是事务控制 2、编程式事务控制 2.1、简介 2.2、相关对象 2.2.1、PlatformTransactionManager 2.2.2、TransactionDefinition 2.2.2.1、事务隔离级别 2.2.2.2、事务传播行为 2.2.3、TransactionStatus 3、声明式事务控制 3.1、简介 3.2、区别 3.3、⭐作…

Unity实现异步加载场景

一&#xff1a;创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件&#xff0c;放置背景图片&#xff0c;然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的&#xff0c;我们改名为LoadSlid…

【考研数学】概率论与数理统计 | 第一章——随机事件与概率(1)

文章目录 一、随机试验与随机事件1.1 随机试验1.2 样本空间1.3 随机事件 二、事件的运算与关系2.1 事件的运算2.2 事件的关系2.3 事件运算的性质 三、概率的公理化定义与概率的基本性质3.1 概率的公理化定义3.2 概率的基本性质 写在最后 一、随机试验与随机事件 1.1 随机试验 …

Docker-使用数据卷、文件挂载进行数据存储与共享

一、前言 默认情况下&#xff0c;在Docker容器内创建的所有文件都只能在容器内部使用。容器删除后&#xff0c;数据也跟着删除&#xff0c;虽然通常我们不会删除容器&#xff0c;但是一旦宿主机发生故障&#xff0c;我们重新创建容器恢复服务&#xff0c;那么之前容器创建的文…

Matlab图坐标轴数值负号改为减号(change the hyphen (-) into minus sign (−, “U+2212”))

在MATLAB中&#xff0c;坐标轴负数默认符号是 - &#xff0c;如下图所示 x 1:1:50; y sin(x); plot(x,y)可通过以下两语句将负号修改为减号&#xff1a; set(gca,defaultAxesTickLabelInterpreter,latex); yticklabels(strrep(yticklabels,-,$-$));或者 set(gca, TickLabe…

安装mmcv失败

安装mmcv时报错 pip install mmcv这里只需要按照提示升级一下pip就可以了 pip install --upgrade pip然后安装成功

OCT介绍和分类

前言&#xff1a;研究方向和OCT有关&#xff0c;为了方便以后回顾&#xff0c;所以整理了OCT相关的一些内容。 OCT介绍和分类 OCT介绍分类时域OCT频域OCT扫频OCT谱域OCT OCT介绍 名称&#xff1a;OCT、光学相干层析成像术、Optical Coherence Tomography。 概念&#xff1a;O…

添加vue devtools扩展工具+添加后F12不显示Vue图标

前言&#xff1a;在开启Vue学习之旅时&#xff0c;遇到问题两个问题&#xff0c;第一添加不上vue devtools扩展工具&#xff0c;第二添加完成后&#xff0c;F12不显示Vue图标。查阅了很多博客&#xff0c;自己解决了问题&#xff0c;故写此博客记录。如果你遇到和我一样的问题&…

Docker容器与虚拟化技术:Docker架构、镜像管理

目录 一、理论 1.Doker概述 2.Docker核心概念 3.Docker安装 4.Docker的镜像管理命令 二、实验 1.Docker安装 2.查看Docker信息 3.Docker的镜像管理命令 三、问题 1.如何注册Docker账号 2.如何设置Docker公共存储库 四、总结 一、理论 1.Doker概述 (1) IT架构 裸…

request发送http请求

今天正式开始为大家介绍接口自动化&#xff0c;相信很多做测试的朋友&#xff0c;都用过一些工具&#xff0c;比如jmeter&#xff0c;loadrunner&#xff0c;postman等等&#xff0c;所以今天先给那些基础不太好的同学&#xff0c;先讲讲postman如何来测接口以及如何用pthon代码…

T113-S3 Tina-Linux -- 2.开发板使用

1. 硬件环境 1.1 开发板 型号&#xff1a;100ASK_T113-PRO Base V1.1&#xff08;韦东山&#xff09;配置&#xff1a;CPU&#xff1a;T113-S3&#xff0c;RAM&#xff1a;128MB&#xff0c;ROM&#xff1a;128MB 2. 各模块使用 2.1 wifi wifi模组型号&#xff1a;XR829…

数学建模(三)整数规划

视频推荐&#xff1a;B站_数学建模老哥 一、整数规划基本原理 数学规划中的变量&#xff08;部分或全部&#xff09;限制为整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。目前所流行的求解整数规划的方法&am…

C语言刷题训练【第11天】

大家好&#xff0c;我是纪宁。 今天是C语言笔试刷题训练的第11天&#xff0c;加油&#xff01; 文章目录 1、声明以下变量&#xff0c;则表达式: ch/i (f*d – i) 的结果类型为&#xff08; &#xff09;2、关于代码的说法正确的是&#xff08; &#xff09;3、已知有如下各变…