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.mzph.cn/news/702102.shtml

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

相关文章

数组详解-格式定义-遍历-求最值-遍历求和-打乱数组中的数据

数组指的是一种容器,可以用来存储同种数据类型的多个值 定义数组格式 : 完整格式-静态初始化 数据类型[]数组名new 数据类型[]{元素1,元素2,元素3...} int[] array new int[]{11,22,33}; 简化格式 int[] array {11,22,33}; 完整格式-动态初始化 初始化时只指定数组长…

mysql的日志文件在哪?

阅读本文之前请参阅----MySQL 数据库安装教程详解(linux系统和windows系统) MySQL的日志文件通常包括错误日志、查询日志、慢查询日志和二进制日志等。这些日志文件的位置取决于MySQL的安装和配置。以下是一些常见的日志文件位置和如何找到它们&#xff…

C++11 Thead线程库的基本使用

文章目录 创建线程传递参数等待线程完成分离线程joinable() 创建线程 要创建线程,我们需要一个可调用的函数或函数对象,作为线程的入口点。在C11中,我们可以使用函数指针、函数对象或lambda表达式来实现。 创建线程的基本语法如下&#xff…

PHP中的飞碟运算符、取反运算符、对比非ASCII字符串、对比浮点数操作

对比浮点数 在电脑里存储的浮点数可能会和输入的值有些许差异,比如输入的是10.0,但存储的是10.00001. 在比较两个浮点数是否相等时可以计算下两个数的差值,然后查看下两数之差是否小于可以接受的阈值,如果要求精度在小数点后5位的…

算法训练day34 Leetcode1005.K次取反后最大化的数组和● 134. 加油站 135. 分发糖果

1005 k次取反后最大化的数组和 题目描述 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回…

ubuntu 22.04LTS的一些使用心得

前言 笔者一直在折腾ubuntu作为开发的主力系统,尤其是最近微信和各种软件陆续支持Debian系列,很多软件都可以用了,当然开源的软件大部分是跨平台的,尤其是idea系列。 X11 OR Wayland 关于X11和wayland,笔者还是使用…

9.5K Star,又一款超棒开源轻量自动化运维平台

Hi,骚年,我是大 G,公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 一个好的运维平台就变得非常重要了,可以节省大量的人力和物…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

c++ Qt 网络连接

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况: 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…

软件工程复习笔记

一、软件工程概述 软件 = 程序 + 数据 + 相关文档 软件危机(Software Crisis) 指由于落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件工程三要素 方法、工具、过程 软件工程目标 在给定成本、进度的…

DDS通信协议

DDS(Data Distribution Service)是一套通信协议和 API 标准;它提供了以数据为中心的连接服务,基于发布者-订阅者模型。这是一套中间件,它提供介于操作系统和应用程序之间的功能,使得组件之间可以互相通信。…

首届Supernova国际青少年模特艺术大赛

2024 全国海选北京站,于 2 月 21 日圆满成功。 # 中国首席超模 # 伍倩 # 超模 # 演员 # 那广子 身着明星挚爱高定礼服 EvaLendel 惊艳亮相。总决赛重磅起航!报名从速! 整场海选比赛全国进行角逐,有北京、深圳、重庆、新…

LeetCode234.回文链表

题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 输入:head [1,2,2,1] 输出:true思路 找到链表的中间节点:可以使用快慢指针…

【JavaEE】_ajax构造HTTP请求

目录 1. ajax简述 2. ajax构造HTTP请求 2.1 jquery库的引入 2.2 ajax构造HTTP请求格式 3. ajax构造GET请求实例 4. ajax构造POST请求实例 本专栏关于form表单构造HTTP请求一文中已经提到:form表单构造法只支持GET和POST,且会触发页面跳转。 原文详…

互联网上的音频和视频服务

1 互联网上的音频和视频服务概述 许多用户开始利用互联网传送音频/视频信息。 在许多情况下,这种音频/视频常称为多媒体信息。 多媒体信息:内容上相互关联的文本、图形、图像、声音、动画和活动图像等所形成的复合数据信息。 多媒体信息的两个最主要…

pwn旅行之[NISACTF 2022]ezpie

[NISACTF 2022]ezpie PIE保护: ​ PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段&#xff08…

MyBatis核心类

MyBatis核心类: SqlSessionFactory:SqlSessionFactoryBuilder SqlSession:是一个接口,有两个实现类 DefaultSqlSession和SqlSessionManager。 SqlSession通过内部存放的执行器(Executor)对数据进行CRUD …

Pytorch 复习总结 3

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 多层感知机。 本文先介绍了多层感知机的用法,再就训练过程中经常出现的过拟…

Spring 容器、核心容器总结

目录 创建容器获取 bean容器类层次结构图核心容器总结容器相关bean 相关依赖注入相关 创建容器 方式一: 类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");方式二: 文件路径加载配…

消息队列-RabbitMQ:延迟队列、rabbitmq 插件方式实现延迟队列、整合SpringBoot

十六、延迟队列 1、延迟队列概念 延时队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。 延…