一、什么是BeanFactory?

  • BeanFactory是Spring框架的最底层接口,是Spring框架的基础设施,里面包含了各种对于Bean的定义,读取Bean的配置文档,管理Bean的加载、实例化,控制Bean的生命周期,维护Bean之间的依赖关系。
  • 通俗的讲,BeanFactory最最典型的功能:getBean,BeanFactory帮助我们创建对象,我们通过getBean从而去拿到创建完成的对象,而不是自己手动去new。(如下图, 很多getBean方法)
  • 表面上BeanFactory只能getBean,实际上,控制反转、基本的依赖注入、直到Bean的生命周期的各种功能都由它的实现类提供
    在这里插入图片描述

二、什么是ApplicationContext?

  • ApplicationContext是BeanFactory的子接口,由BeanFactory派生而来,通常成为Spring上下文,具有BeanFactory的基本功能。大概理解为BeanFactory有的,ApplicationContext都有(如下图)。
  • 此外,ApplicationContext扩展了BeanFactory接口的功能
    • 国际化
    • 通配符方式获取一组 Resource 资源
    • 整合 Environment 环境(能通过它获取各种来源的配置信息)
    • 事件发布与监听,实现组件之间的解耦
      在这里插入图片描述

三、BeanFactory与ApplicationContext的联系和区别

区别1(功能上)

如上述介绍所说:BeanFactory是Spring的最底层接口,定义了IOC的基本功能,包含:各种Bean的定义、加载、实例化、依赖注入以及生命周期的管理。ApplicationContext接口继承了BeanFactory,除了提供BeanFactory所具有的基本功能以外,它还提供了更完整的框架功能:他还继承了MessageSource,因此还支持国际化,资源文件访问等功能;

区别2(加载形式)

BeanFactory在初始化容器的时候,并未实例化Bean,直到需要使用某个Bean(调用getBean()方法) 时才实例目标Bean,导致不能及时发现可能存在的一些配置上的问题。
ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean,我们可以及时的发现配置中有可能存在的问题;由于ApplicationContext启动后加载了所有的单实例Bean,所以运行时速度比较快;唯一的不足在于它占用内存空间,配置的Bean较多时,启动会比较慢。

区别3(后处理器BeanPostProcessor 、BeanFactoryPostProcessor )

BeanFactory与ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor使用,BeanFactory使用需要手动注册,ApplicationContext则自动注入。(不懂看后面的篇幅会有解释)

总结

  • ApplicationContext 包含 BeanFactory 的所有特性,通常推荐使用前者。但是也有一些限制情形,比如移动应用内存消耗比较严苛,在那些情景中,使用更轻量级的 BeanFactory 是更合理的。然而,在大多数企业级的应用中,ApplicationContext 是首选。
  • 简而言之,BeanFactory提供了配置框架和基本功能,ApplicationContext增加了更多针对企业的功能。ApplicationContext是BeanFactory的一个完整的超集。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐