当前位置: 首页 > 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 {
    // 获取 Bean
    Object getBean(String name) throws BeansException;
​
    // 获取指定类型的 Bean
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
​
    // 判断是否包含指定名称的 Bean
    boolean 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 {
​
    // 获取容器的唯一 ID
    String getId();
​
    // 获取容器的显示名称
    String getDisplayName();
​
    // 获取容器的启动时间
    long getStartupDate();
​
    // 获取父容器
    ApplicationContext getParent();
​
    // 获取 AutowireCapableBeanFactory
    AutowireCapableBeanFactory 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 容器的核心机制。

相关文章:

  • MYSQL数据库创建命令
  • 深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限
  • MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置
  • 电路中如何计算电容容值大小
  • 013作用域
  • php特性
  • c++ 中的容器 vector 与数组 array
  • wzl-django学习
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_buf_t
  • MAVEN的安装和配置指南【超详细】
  • 《Web安全渗透测试实战:DVWA靶场全关卡通关指南(高/中/低/不可能级别)|手把手教你掌握漏洞挖掘与渗透技巧》
  • 图像仿射变换
  • 计算机黑皮书191本分享pdf
  • 卷积神经网络(cnn,类似lenet-1,八)
  • ETL系列-数据抽取(Extract)
  • [AI 概念域] LangChain 生态工具概念解读(通俗解读)
  • [Linux]项目自动化构建工具-make/Makefile
  • 跟我学C++中级篇——定时器的设计
  • 初阶数据结构(C语言实现)——3顺序表和链表(3)
  • 《第十五部分》STM32之FLASH闪存(终结篇)
  • 菏泽 做网站 多少钱/下载爱城市网app官方网站
  • vps如何做网站步骤/国内网络营销公司排名
  • 企业网站服务费怎么做记账凭证/今日头条新闻
  • 做婚恋网站要多少钱/优化大师win10
  • 网站里的地图定位怎么做的/舆情监测分析系统
  • 可信网站身份验证 必须做吗/百度搜图入口