当前位置: 首页 > news >正文

spring--ApplicationContext和BeanFactory的区别(源码)

ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。

一、 功能对比

特性BeanFactoryApplicationContext
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 源码

ApplicationContextBeanFactory 的子接口,扩展了更多功能。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
​// 获取容器的唯一 IDString getId();
​// 获取容器的显示名称String getDisplayName();
​// 获取容器的启动时间long getStartupDate();
​// 获取父容器ApplicationContext getParent();
​// 获取 AutowireCapableBeanFactoryAutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
  • 扩展功能:

    1. 事件发布

      void publishEvent(ApplicationEvent event);
      • 支持事情驱动变成,可以通过ApplicationEventPublisher发布事件

    2. 国际化支持

      String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
      • 支持通过MessageSource实现国际化

    3. 资源访问

      Resource[] getResources(String locationPattern) throws IOException;
      • 支持通过ResourceLoader访问资源文件

    4. AOP支持

      • 通过集成AOP模块,支持面向切面编程

    5. 注解支持

      • 支持通过注解(如@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 管理功能。

  • ApplicationContextBeanFactory 的扩展,提供了更多企业级功能。

  • 在实际开发中,通常使用 ApplicationContext,因为它功能更强大,使用更方便。

通过理解 BeanFactoryApplicationContext 的区别和源码实现,可以更好地掌握 Spring 容器的核心机制。

相关文章:

spring--ApplicationContext和BeanFactory的区别(源码)

ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口&#xff0c;它们都用于管理和访问 Spring 容器中的 Bean&#xff0c;但在功能和使用场景上有显著的区别。以下是它们的详细对比&#xff0c;并结合源码进行讲解。 一、 功能对比 特性BeanFactoryApplicati…...

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&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&#xff1a;是Vue官方提供的脚手架之一,底层采用官方自主研发的vite,快捷&#xff0c;开发方便。 3.准备工作:系统中需要安装nodejs环境&#xff0c;在该环境中提供npm包管理器 4.创建Vue项目的命令:npm init vuela…...

数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)

1 引言 线性数据结构的元素满足唯一的线性关系&#xff0c;每个元素&#xff08;初第一个和最后一个外&#xff09;只有一个直接前趋和一个直接后继。树形数据结构的元素之间有着明显的层次关系。但是图形结构的元素之间的关系是任意的。 什么是图&#xff1f; 简单来说&…...

前端八股——JS+ES6

前端八股&#xff1a;JSES6 说明&#xff1a;个人总结&#xff0c;用于个人复习回顾&#xff0c;将持续改正创作&#xff0c;已在语雀公开&#xff0c;欢迎评论改正。...

Python 课堂点名桌面小程序

一、场景分析 闲来无事&#xff0c;老婆说叫我开发一个课堂点名桌面小程序&#xff0c;给她在课堂随机点名学生问问题。 人生苦短&#xff0c;那就用 Python 给她写一个吧。 二、依赖安装 因为要用到 excel&#xff0c;所以安装两个依赖&#xff1a; pip install openpyxl…...

【Java基础】Java中new一个对象时,JVM到底做了什么?

Java中new一个对象时&#xff0c;JVM到底做了什么&#xff1f; 在Java编程中&#xff0c;new关键字是我们创建对象的最常用方式。但你是否想过&#xff0c;当你写下new MyClass()时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;到底在背后做了哪些工作&#xff1f;今天&…...

C#中的字典怎么使用?

在C#中&#xff0c;Dictionary<TKey, TValue> 是一个泛型集合类&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它提供了快速的查找、插入和删除操作&#xff0c;适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作&#xf…...

vue框架后遗症∶被遗忘的dom操作

用多了vue、react等前端框架&#xff0c;不得不说用数据驱动视图来开发真的很香&#xff0c;但是也免不了会有不用这些框架的项目&#xff0c;dom操作还是很有必要的&#xff0c;一开始学习网页设计的时候就教过&#xff0c;后面一直开发项目基本上用框架。虽然有些想不起来了&…...

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…...

MyBatis-Plus注解配置:@TableName、@TableId、@TableField

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus 提供了一系列注解,用于简化数据库表与实体类之间的映射关系。以下是 @TableName、@TableId 和 @TableField 这三个常用注解的配置和使用说明。 官方文档:…...

DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案

项目场景&#xff1a; deepseek部署常用系统Ubuntu系统&#xff0c; xshell5连接Ubuntu22遇到如下问题&#xff1a; 问题描述 xshell5连接Ubuntu22遇到如下问题&#xff1a; Connecting to 172.16.46.80:22... Could not connect to 172.16.46.80 (port 22): Connection fa…...

论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测

摘要 由于现实世界数据的稀缺性&#xff0c;基于深度学习的水下水雷探测受到了限制。这种稀缺性导致过拟合&#xff0c;即模型在训练数据上表现良好&#xff0c;但在未见数据上表现不佳。本文提出了一种使用扩散模型的Syn2Real &#xff08;Synthetic to Real&#xff09;域泛…...

【Java】Tomcat日志

Tomcat日志 tomcat 日志的配置文件是tomcat目录下的/conf/logging.properties。 日志输出级别&#xff1a;SEVERE (最高级别) > WARNING > INFO > CONFIG > FINE > FINER(精心) > FINEST (所有内容,最低级别) 日志分类 tomcat 有五类日志 &#xff1a; …...

datalist 是什么?

一、datalist 是什么&#xff1f; datalist 是 HTML5 引入的一个表单相关元素&#xff0c;它本质上是一个为输入框&#xff08;<input>&#xff09;提供预定义选项列表的容器。从外观上看&#xff0c;当用户在与之关联的输入框中进行输入操作时&#xff0c;会自动弹出一个…...

初阶数据结构(C语言实现)——3顺序表和链表(3)

3.链表 3.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出&#xff0c;链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续…...

Docker 数据卷管理及优化

Docker 数据卷是一个可供容器使用的特殊目录&#xff0c;它绕过了容器的文件系统&#xff0c;直接将数据存储在宿主机上。通过数据卷&#xff0c;可以实现数据的持久化、共享以及独立于容器生命周期的管理。 1.1 为什么要用数据卷 Docker 分层文件系统的特点 性能差&#xff…...

Hi3516CV610车牌识别算法源码之——车牌识别算法初体验

本文讲述如何使用Hi3516CV610开发板读取本地图片&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 下一篇将介绍Hi3516CV610开发板如何从sensor摄像头获取图像&#xff0c;运行车牌识别算法推理&#xff0c;得到车牌信息并打印&#xff1b; 一、准…...

观察Taotoken在多模型间自动路由与容灾切换的实际响应情况

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken在多模型间自动路由与容灾切换的实际响应情况 在构建依赖大模型服务的应用时&#xff0c;服务的连续性与稳定性是开发…...

AI动态简报之算力基建篇(2026.05.24)

关注方向&#xff1a;大模型 GPU算力 AI芯片 云计算 大模型API⚡ 第1条&#xff1a;全球九大云厂商资本支出上调至8300亿美元&#xff0c;年增79%核心信息&#xff1a;TrendForce集邦咨询最新报告将2026年全球九大CSP&#xff08;谷歌、AWS、Meta、微软、甲骨文、字节跳动、…...

物联网DDoS检测:XGBoost、KNN、SGD与朴素贝叶斯性能对比

1. 项目概述&#xff1a;当物联网遇上DDoS&#xff0c;我们如何用机器学习“看门”&#xff1f;在网络安全这个没有硝烟的战场上&#xff0c;DDoS攻击一直是让运维和架构师们头疼的“流量洪水”。传统的防御手段&#xff0c;比如基于固定阈值的流量清洗或者已知攻击特征的签名匹…...

DeepSeek-R1、V2、V3如何选?:3分钟掌握版本差异与业务匹配公式

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek-R1、V2、V3如何选&#xff1f;&#xff1a;3分钟掌握版本差异与业务匹配公式 DeepSeek-R1、V2、V3 是 DeepSeek 系列中面向不同推理场景演进的三个关键版本&#xff0c;其核心差异不在参数量堆叠&…...

如何轻松转换B站缓存视频:m4s-converter终极实用指南

如何轻松转换B站缓存视频&#xff1a;m4s-converter终极实用指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了喜欢的视…...

如何用roop-unleashed三分钟制作专业级AI换脸视频:零门槛人脸替换终极指南

如何用roop-unleashed三分钟制作专业级AI换脸视频&#xff1a;零门槛人脸替换终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 还在为复杂的AI换脸工…...

如何在macOS上使用LyricsX打造完美歌词体验:终极指南

如何在macOS上使用LyricsX打造完美歌词体验&#xff1a;终极指南 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的终极歌词同步应用&#xff0c;能够自动为你…...

百度网盘Mac版SVIP破解插件:从龟速到极速的下载体验优化指南

百度网盘Mac版SVIP破解插件&#xff1a;从龟速到极速的下载体验优化指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否曾经面对百度网盘那令人…...

SPT-AKI Profile Editor:终极《逃离塔科夫》离线存档编辑器完全指南

SPT-AKI Profile Editor&#xff1a;终极《逃离塔科夫》离线存档编辑器完全指南 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com…...

百度网盘直链解析:告别限速的Python神器实战指南

百度网盘直链解析&#xff1a;告别限速的Python神器实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经面对百度网盘几十KB的下载速度感到绝望&#xff1f;当你…...