Spring官网是如何解释ApplicationContext和BeanFacotry的区别的?

在Spring官网中是这么介绍ApplicationContext和BeanFacotry的(可直接看后面的翻译):

大概翻译一下就是: BeanFactory接口提供了一种先进的配置机制,可以用于定义和管理对象,而且它不受对象类型的限制,可以用于管理各种类型的对象,使Spring框架非常灵活和适用于各种应用场景,ApplicationContext是BeanFactory的子接口,在BeanFactory的基础上添加了:

  1. 更容易与Spring AOP集成
  2. 资源处理(用于国际化)
  3. 事件发布
  4. 能扩展出特定的Spring容器,如用于Web应用程序的WebApplicationContext。

简而言之,BeanFactory提供了一些基本功能,而ApplicationContext添加了更多面向企业的特定功能。ApplicationContext是BeanFactory的完整超集(拥有并超过BeanFactory的所有功能),在本章中Spring IoC容器指的就是ApplicationContext。

首先ApplicationContext是BeanFactory的子接口,这个看源码也能发现:

ListableBeanFactory和HierarchicalBeanFactory也继承了BeanFactory,所以ApplicationContext除开继承了BeanFactory之外,还继承了EnvironmentCapable、MessageSource、ApplicationEventPublisher、ResourcePatternResolver四个接口,所以,官网上说ApplicationContext是BeanFactory的完整超集,ApplicationContext在拥有BeanFactory所有功能的同时,还拥有另外四个接口的功能,它们的功能分别是:

  1. EnvironmentCapable:获取环境变量
  2. MessageSource:国际化
  3. ApplicationEventPublisher:事件发布
  4. ResourcePatternResolver:资源获取

比如我们可以直接用ApplicationContext对象来发布事件,而BeanFactory则不行,它没有publishEvent()方法:

但是,在Spring官网上还额外说到,ApplicationContext比BeanFactory更容易与Spring AOP集成,这又该怎么理解呢,我们继续往下看。

假如有一个Aspect:

如果我用AnnotationConfigApplicationContext,那么我只需要在配置类上加上@EnableAspectJAutoProxy注解,那么Aspect就生效了,比如:

但是如果用BeanFactory,则需要这样:

  1. 首先要创建BeanFactory对象
  2. 注册bean,BeanFactory是不带有扫描功能的,所以需要手动注册bean
  3. 手动添加aop相关的BeanPostProcessor
  4. 最后利用BeanFactory创建Bean对象,Aspect生效

从中可以看出,第2、3步是需要程序员手动做的,那为什么ApplicationContext不需要呢?其实也需要,只不过是ApplicationContext内部做了,而不需要程序员来做了,相当于ApplicationContext帮我们实现了这些代码,ApplicationContext底层用的仍然是BeanFactory。

我们可以理解为,BeanFactory提供的功能是积木,ApplicationContext则利用这些积木来搭建出更适合程序员和企业的高级功能,所以官网上说能基于BeanFactory构建出具有特定功能的Spring容器,比如WebApplicationContext。

另外,Spring中非常重要的一个功能就是解析配置类,诸如扫描、解析@Bean、解析@Import等都属于解析配置类,而解析配置类这个功能是ApplicationContext才有的,BeanFactory是没有的,这也是ApplicationContext强大的地方,另外像BeanFactoryPostProcessor机制也是ApplicationContext中提供的。

所以,假如面试官再问你ApplicationContext和BeanFactory的区别,你是不是能征服面试官了呢?

我是爱读源码的大都督周瑜,欢迎关注我的公众号:Hoeller。

相关推荐
高频因子挖掘机16 分钟前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i8 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡9 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF11 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_11 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi