spring--ApplicationContext和BeanFactory的区别(源码)
ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。
一、 功能对比
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| Bean 管理 | 支持基本的 Bean 管理和依赖注入。 | 支持 BeanFactory 的所有功能,并扩展了更多特性。 |
| 事件发布 | 不支持。 | 支持事件发布机制(ApplicationEvent)。 |
| 国际化支持 | 不支持。 | 支持国际化(MessageSource)。 |
| 资源访问 | 不支持。 | 支持资源访问(ResourceLoader)。 |
| AOP 支持 | 不支持。 | 支持 AOP(面向切面编程)。 |
| 注解支持 | 不支持。 | 支持注解配置(如 @Component、@Autowired)。 |
| 加载时机 | 懒加载(Lazy Loading)。 | 预加载(Eager Loading),启动时初始化所有单例 Bean。 |
| 使用场景 | 适合资源受限的环境(如移动设备)。 | 适合大多数企业级应用。 |
二、源码讲解
1、BeanFactory源码
BeanFactory是Spring容器的最基本接口,定义了Bean的获取和管理方法
public interface BeanFactory {// 获取 BeanObject getBean(String name) throws BeansException;
// 获取指定类型的 Bean<T> T getBean(String name, Class<T> requiredType) throws BeansException;
// 判断是否包含指定名称的 Beanboolean containsBean(String name);
// 判断 Bean 是否为单例boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 判断 Bean 是否为原型boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
// 获取 Bean 的类型Class<?> getType(String name) throws NoSuchBeanDefinitionException;
// 获取 Bean 的别名String[] getAliases(String name);
}
-
特点
-
BeanFactory是一个简单的容器接口,只提供最基本的Bean管理功能
-
默认适用懒加载(Lazy Loading)机制,只有在调用getBean()时才会初始化Bean
-
2、ApplicationContext 源码
ApplicationContext是 BeanFactory 的子接口,扩展了更多功能。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
// 获取容器的唯一 IDString getId();
// 获取容器的显示名称String getDisplayName();
// 获取容器的启动时间long getStartupDate();
// 获取父容器ApplicationContext getParent();
// 获取 AutowireCapableBeanFactoryAutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
-
扩展功能:
-
事件发布
void publishEvent(ApplicationEvent event);
-
支持事情驱动变成,可以通过ApplicationEventPublisher发布事件
-
-
国际化支持
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
-
支持通过MessageSource实现国际化
-
-
资源访问
Resource[] getResources(String locationPattern) throws IOException;
-
支持通过ResourceLoader访问资源文件
-
-
AOP支持
-
通过集成AOP模块,支持面向切面编程
-
-
注解支持
-
支持通过注解(如@Component、@Autowired)配置Bean
-
-
-
特点:
-
ApplicationContext 是一个高级容器接口,提供了更多企业级功能。
-
默认采用预加载(Eager Loading)机制,启动时初始化所有单例 Bean。
-
三、具体实现类
1、BeanFactory 的实现类
-
DefaultListableBeanFactory
-
是BeanFactory的默认实现类,提供了完整的Bean管理功能
-
源码示例:
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.loadBeanDefinitions(new ClassPathResource("beans.xml")); MyBean myBean = beanFactory.getBean(MyBean.class);
(这里就是在Resources下beans.xml这个文件,约定大于配置)
-
2、ApplicationContext的实现类
-
ClassPathXmlApplicationContext
-
从类路径加载 XML 配置文件的 ApplicationContext实现。
-
源码示例:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean myBean = context.getBean(MyBean.class);
-
-
AnnotationConfigApplicationContext
-
基于注解配置的ApplicationContext实现
-
源码示例
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); MyBean myBean = context.getBean(MyBean.class);
AppConfig注解类
-
-
FileSystemXmlApplicationContext
-
用于读取系统文件目中的配置文件
-
四、 使用场景
-
BeanFactory:
-
适合资源受限的环境(如移动设备)。
-
需要手动调用
getBean()初始化 Bean。
-
-
ApplicationContext:
-
适合大多数企业级应用。
-
提供更多高级功能(如事件发布、国际化、AOP 等)。
-
五、 总结
-
BeanFactory 是 Spring 容器的基础接口,提供最基本的 Bean 管理功能。
-
ApplicationContext 是
BeanFactory的扩展,提供了更多企业级功能。 -
在实际开发中,通常使用
ApplicationContext,因为它功能更强大,使用更方便。
通过理解 BeanFactory 和 ApplicationContext 的区别和源码实现,可以更好地掌握 Spring 容器的核心机制。
相关文章:
spring--ApplicationContext和BeanFactory的区别(源码)
ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。 一、 功能对比 特性BeanFactoryApplicati…...
HTMLS基本结构及标签
HTML5是目前制作网页的核心技术,有叫超文本标记语言。 基本结构 声明部分位于文档的最前面,用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后,用于告知浏览器这是一个HTML文档。< html>表示文档开始,&l…...
【蓝桥杯嵌入式】各模块学习总结
系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…...
Vue的项目创建以及项目目录与组合式API
一.创建Vue 1.Vue-CLI:创建Vue的脚手架工具 2.Create-vue:是Vue官方提供的脚手架之一,底层采用官方自主研发的vite,快捷,开发方便。 3.准备工作:系统中需要安装nodejs环境,在该环境中提供npm包管理器 4.创建Vue项目的命令:npm init vuela…...
数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)
1 引言 线性数据结构的元素满足唯一的线性关系,每个元素(初第一个和最后一个外)只有一个直接前趋和一个直接后继。树形数据结构的元素之间有着明显的层次关系。但是图形结构的元素之间的关系是任意的。 什么是图? 简单来说&…...
前端八股——JS+ES6
前端八股:JSES6 说明:个人总结,用于个人复习回顾,将持续改正创作,已在语雀公开,欢迎评论改正。...
Python 课堂点名桌面小程序
一、场景分析 闲来无事,老婆说叫我开发一个课堂点名桌面小程序,给她在课堂随机点名学生问问题。 人生苦短,那就用 Python 给她写一个吧。 二、依赖安装 因为要用到 excel,所以安装两个依赖: pip install openpyxl…...
【Java基础】Java中new一个对象时,JVM到底做了什么?
Java中new一个对象时,JVM到底做了什么? 在Java编程中,new关键字是我们创建对象的最常用方式。但你是否想过,当你写下new MyClass()时,Java虚拟机(JVM)到底在背后做了哪些工作?今天&…...
C#中的字典怎么使用?
在C#中,Dictionary<TKey, TValue> 是一个泛型集合类,用于存储键值对(key-value pairs)。它提供了快速的查找、插入和删除操作,适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作…...
vue框架后遗症∶被遗忘的dom操作
用多了vue、react等前端框架,不得不说用数据驱动视图来开发真的很香,但是也免不了会有不用这些框架的项目,dom操作还是很有必要的,一开始学习网页设计的时候就教过,后面一直开发项目基本上用框架。虽然有些想不起来了&…...
进程 ─── linux第10课
目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...
线性模型 - 支持向量机
支持向量机(SVM)是一种用于分类(和回归)的监督学习算法,其主要目标是找到一个最佳决策超平面,将数据点分为不同的类别,并且使得分类边界与最近的数据点之间的间隔(margin)…...
MyBatis-Plus注解配置:@TableName、@TableId、@TableField
MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 提供了一系列注解,用于简化数据库表与实体类之间的映射关系。以下是 @TableName、@TableId 和 @TableField 这三个常用注解的配置和使用说明。 官方文档:…...
DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案
项目场景: deepseek部署常用系统Ubuntu系统, xshell5连接Ubuntu22遇到如下问题: 问题描述 xshell5连接Ubuntu22遇到如下问题: Connecting to 172.16.46.80:22... Could not connect to 172.16.46.80 (port 22): Connection fa…...
论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测
摘要 由于现实世界数据的稀缺性,基于深度学习的水下水雷探测受到了限制。这种稀缺性导致过拟合,即模型在训练数据上表现良好,但在未见数据上表现不佳。本文提出了一种使用扩散模型的Syn2Real (Synthetic to Real)域泛…...
【Java】Tomcat日志
Tomcat日志 tomcat 日志的配置文件是tomcat目录下的/conf/logging.properties。 日志输出级别:SEVERE (最高级别) > WARNING > INFO > CONFIG > FINE > FINER(精心) > FINEST (所有内容,最低级别) 日志分类 tomcat 有五类日志 : …...
datalist 是什么?
一、datalist 是什么? datalist 是 HTML5 引入的一个表单相关元素,它本质上是一个为输入框(<input>)提供预定义选项列表的容器。从外观上看,当用户在与之关联的输入框中进行输入操作时,会自动弹出一个…...
初阶数据结构(C语言实现)——3顺序表和链表(3)
3.链表 3.1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续…...
Docker 数据卷管理及优化
Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机上。通过数据卷,可以实现数据的持久化、共享以及独立于容器生命周期的管理。 1.1 为什么要用数据卷 Docker 分层文件系统的特点 性能差ÿ…...
Hi3516CV610车牌识别算法源码之——车牌识别算法初体验
本文讲述如何使用Hi3516CV610开发板读取本地图片,运行车牌识别算法推理,得到车牌信息并打印; 下一篇将介绍Hi3516CV610开发板如何从sensor摄像头获取图像,运行车牌识别算法推理,得到车牌信息并打印; 一、准…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
