Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图:
在这里插入图片描述
区别:
1:包目录不同:
spring-beans.jar 中 org.springframework.beans.factory.BeanFactory
spring-context.jar 中 org.springframework.context.ApplicationContext

2:国际化:
BeanFactory 是不支持国际化功能的,因为 BeanFactory 没有扩展 Spring 中 MessageResource
接口。相反,由于 ApplicationContext 扩展了 MessageResource 接口,因而具有消息处理的能力
(i18N)。

3:强大的事件机制(Event):
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式,ApplicationContext 的事件机制
主要通过 ApplicationEvent 和 ApplicationListener 这两个接口来提供的,和 Java swing 中的事件
机制一样。即当 ApplicationContext 中发布一个事件时,所有扩展了 ApplicationListener 的 Bean
都将接受到这个事件,并进行相应的处理。

4:底层资源的访问:
ApplicationContext 扩展了 ResourceLoader(资源加载器)接口,从而可以用来加载多个
Resource,而 BeanFactory 是没有扩展 ResourceLoader。

5:对 Web 应用的支持:
与 BeanFactory 通常以编程的方式被创建,ApplicationContext 能以声明的方式创建,如使用
ContextLoader。当然你也可以使用 ApplicationContext 的实现方式之一,以编程的方式创建 ApplicationContext实例。

6:延迟加载:

  • BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用
    getBean()),才对该 Bean 进行加载实例化。这样,我们就不能发现一些存在的 spring 的配置
    问题。而 ApplicationContext 则相反,它是在容器启动时,一次性创建了所有的 Bean。这
    样,在容器启动时,我们就可以发现 Spring 中存在的配置错误。
  • BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、
    BeanFactoryPostProcessor 的使用。两者之间的区别是:BeanFactory 需要手动注册,而
    ApplicationContext 则是自动注册。

可以看到,ApplicationContext 继承了 BeanFactory,BeanFactory 是 Spring 中比较原始的
Factory,它不支持 AOP、Web 等 Spring 插件。而 ApplicationContext 不仅包含了 BeanFactory
的所有功能,还支持 Spring 的各种插件,还以一种面向框架的方式工作以及对上下文进行分层和实
现继承。

BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;而 ApplicationContext 面向使用
Spring 的开发者,相比 BeanFactory 提供了更多面向实际应用的功能,几乎所有场合都可以直接使
用 ApplicationContext,而不是底层的 BeanFactory。

7:常用容器:
BeanFactory 类型的有 XmlBeanFactory,它可以根据 XML 文件中定义的内容,创建相应的
Bean。
ApplicationContext 类型的常用容器有:

  • ClassPathXmlApplicationContext:从 ClassPath 的 XML 配置文件中读取上下文,并生成上
    下文定义。应用程序上下文从程序环境变量中取得。
  • FileSystemXmlApplicationContext:由文件系统中的 XML 配置文件读取上下文。
  • XmlWebApplicationContext:由 Web 应用的 XML 文件读取上下文。例如我们在 Spring MVC
    使用的情况。

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

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

相关文章

查看mysql数据库的版本

要查看MySQL数据库的版本,可以使用以下几种方法: 命令行(已连接到MySQL服务器): 登录到MySQL服务器后,在MySQL提示符下执行: mysql> SELECT VERSION(); 或者,也可以执行 STATUS; …

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …

微信小程序错误----config is not defined

微信小程序出错 请求头发生错误 修改 options.header {// 为请求头对象添加 token 验证的 Authorization 字段Access-Token: token,platform: MP-WEIXIN,// 保留原有的 header...options.header,}

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

3.WEB渗透测试-前置基础知识-快速搭建渗透环境(上)

上一个内容:2.WEB渗透测试-前置基础知识-web基础知识和操作系统-CSDN博客 1.安装虚拟机系统 linux Kali官网下载地址: https://www.kali.org/get-kali/#kali-bare-metal Centos官网下载地址: https://www.centos.org/download/ Deepin官网下…

复制策略深入探讨

在之前的博客中,我们讨论了复制最佳实践和不同类型的复制,例如批量、站点和存储桶。但是,随着所有这些不同类型的复制类型的出现,人们不得不想知道在哪里使用哪种复制策略?从现有 S3 兼容数据存储迁移数据时&#xff0…

【03】逆序数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、逆序函数是什么? 二、逆序函数原码 1.直接逆序 2.创建临时数组逆序 三、结言 💥一、逆序函数是什么? 示例:输入1 4 …

火绒(显示病毒HEUR:Trojan/AvKiller.c),误删explore.exe,导致电脑白屏,解决方法

桌面程序explore.exe被火绒当病毒清理了 对,就是火绒导致的,如果按照操作依然黑/白屏,直接找到火绒安装目录打开火绒在右上角设置区找到隔离区里把explorer全部恢复,然后根据提示加到白名单,最后关闭程序后重启或者直接…

在autodl搭建stable-diffusion-webui+sadTalker

本文介绍在autodl.com搭建gpu服务器,实现stable-diffusion-webuisadTalker功能,图片音频 可生成视频。 autodl租GPU 自己本地部署SD环境会遇到各种问题,网络问题(比如huggingface是无法访问),所以最好的方…

Qt QWidget 简约美观的加载动画 第二季

&#x1f603; 第二季来啦 &#x1f603; 简约的加载动画,用于网络查询等耗时操作时给用户的提示. 这是最终效果: 一共只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #i…

【Golang】Golang使用embed加载、打包静态资源文件

【Golang】Golang使用embed加载、打包静态资源文件 大家好 我是寸铁&#x1f44a; 总结了一篇Golang使用embed加载静态资源文件的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 事情是这样的&#xff1a;前不久&#xff0c;有同学问我,golang怎么把静态资源文件打包成一…

STM32单片机基本原理与应用(九)

SDIO/SD卡实验 实验内容 将SD卡插入实训平台并烧写程序&#xff0c;开机后TFTLCD屏幕上会显示是否成功初始化SD卡并显示SD卡容量。 电路原理图 实验原理 SD卡的通信方式有两种&#xff1a;SPI和SDIO。SD卡有五种寄存器&#xff0c;如下表 SD 卡的指令由 6 个字节组成&…