当前位置: 首页 > 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 容器的核心机制。

http://www.lryc.cn/news/544667.html

相关文章:

  • HTMLS基本结构及标签
  • 【蓝桥杯嵌入式】各模块学习总结
  • Vue的项目创建以及项目目录与组合式API
  • 数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)
  • 前端八股——JS+ES6
  • Python 课堂点名桌面小程序
  • 【Java基础】Java中new一个对象时,JVM到底做了什么?
  • C#中的字典怎么使用?
  • vue框架后遗症∶被遗忘的dom操作
  • 进程 ─── linux第10课
  • 线性模型 - 支持向量机
  • MyBatis-Plus注解配置:@TableName、@TableId、@TableField
  • DeepSeek接入问题-Xshell5连接Ubuntu22失败解决方案
  • 论文阅读之基于Syn2Real域的侧扫声纳类水雷目标探测
  • 【Java】Tomcat日志
  • datalist 是什么?
  • 初阶数据结构(C语言实现)——3顺序表和链表(3)
  • Docker 数据卷管理及优化
  • Hi3516CV610车牌识别算法源码之——车牌识别算法初体验
  • 使用内置命令查看笔记本电池健康状态
  • HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统
  • transformer架构的语言模型保存的内容与格式详解
  • win本地vscode通过代理远程链接linux服务器
  • 【C++编程探索】01前缀和来临!优点多多!八千字详解
  • 文件下载技术的终极选择:`<a>` 标签 vs File Saver.js
  • 《机器学习数学基础》补充资料:矩阵的LU分解
  • [笔记.AI]AI知识科普提纲
  • Spring Security 如何防止 CSRF 攻击?
  • 使用 Kubeflow 和 Ray 构建机器学习平台
  • SEO炼金术(4)| Next.js SEO 全攻略