通俗易懂!BeanFactory vs ApplicationContext 一次讲透(2025 面试 100% 会问,背完直接秒杀)
| 项目 | BeanFactory | ApplicationContext | 谁才是你每天用的那个? |
|---|---|---|---|
| 官方定位 | 最原始、最底层的 IoC 容器接口 | 高级容器 = BeanFactory + 一堆高级生活服务 | ApplicationContext |
| 加载时机 | 懒加载(用的时候才去创建 Bean) | 启动时立刻把所有 singleton Bean 造好(爽!) | ApplicationContext |
| 常用实现类 | XmlBeanFactory(已过时) | ClassPathXmlApplicationContext AnnotationConfigApplicationContext(现在主流) | 99.9% 用后两个 |
| 核心功能 | 就一个:getBean() | 继承 BeanFactory + 额外加了 10 大高级功能 | ApplicationContext |
| 你平时写的代码里出现的 | 几乎见不到 | 每天都见:SpringApplication.run(…) 就是它 | ApplicationContext |
ApplicationContext 比 BeanFactory 多出来的 10 大“生活服务”(记住前 6 个就够面试)
| 功能 | 具体表现 | 日常例子 |
|---|---|---|
| 1. 事件发布与监听 | ApplicationEvent + @EventListener | 用户注册后发欢迎邮件、刷新缓存 |
| 2. 国际化 i18n | MessageSource | 登录页面中英文自动切换 |
| 3. 资源加载 | ResourceLoader | classpath:、file:、http: 随便读文件 |
| 4. 环境抽象 | Environment + @Profile | dev/test/prod 三套配置自动切换 |
| 5. 自动刷新 + 预加载 | refresh() 一次性把所有单例 Bean 造好 | 启动就准备好几千个 Bean,随时 getBean |
| 6. AOP 自动代理 | 自动识别 @Aspect 并织入 | @Transactional 直接生效 |
| 7. 生命周期管理 | 自动调用 SmartLifecycle | 启动时自动连 Redis、MQ |
| 8. 父子容器层级 | HierarchicalBeanFactory | Spring + SpringMVC 两层容器 |
| 9. 配置属性绑定 | @ConfigurationProperties | application.yml 自动绑到对象 |
| 10. 可观测性支持 | Micrometer Observation | 链路追踪自动采集 |
经典面试题 + 标准答案(直接背)
- BeanFactory 和 ApplicationContext 的区别?
答:BeanFactory 是最基础的 IoC 容器,只提供 getBean 功能,懒加载。
ApplicationContext 是它的加强超级版,启动就预加载所有单例 Bean,还额外提供事件、国际化、资源加载、Environment、AOP 等企业级功能。实际项目 100% 用 ApplicationContext。 - 你平时 new 的容器是哪个?
答:在 Spring Boot 里根本不用自己 new,SpringBootApplication 启动后自动给我们一个 AnnotationConfigServletWebServerApplicationContext(名字很长,但就是 ApplicationContext 的子类)。 - 为什么几乎没人用 BeanFactory?
答:因为它太原始了,懒加载导致第一次 getBean 很慢,而且没有事件、没有国际化、没有 @Profile,写企业项目根本用不爽。 - ApplicationContext 是线程安全的吗?
答:容器本身是线程安全的,同一个 Bean(默认 singleton)在多线程下拿到的都是同一个实例。但 Bean 本身的线程安全要看你代码怎么写(无状态最好)。
一张图记住层级关系(面试画图必备)
ApplicationContext(你每天用的)
↑ 继承
ConfigurableApplicationContext
↑ 继承
AbstractApplicationContext
↑ 实现
BeanFactory(最底层接口,几乎不用)
实际项目里你见到的几种 ApplicationContext(记住名字就行):
| 场景 | 容器全名 | 备注 |
|---|---|---|
| 纯 Spring 项目 | AnnotationConfigApplicationContext | 手写 new 的时候用 |
| Spring Boot Web | AnnotationConfigServletWebServerApplicationContext | 自动创建,带内嵌 Tomcat |
| 响应式 WebFlux | AnnotationConfigReactiveWebServerApplicationContext | 用 Netty 启动 |
| 测试环境 | AnnotationConfigApplicationContext | @SpringBootTest 里用 |
终极记忆口诀(背下来 10 秒答完)
“BeanFactory 是个光杆司令,只会造 Bean,懒汉一个;
ApplicationContext 是五星级酒店管家,一启动就把所有单例 Bean 造好,还包吃包住包娱乐(事件、国际化、资源、AOP),你上班天天住的就是它!”
记住这张表 + 这句口诀,
下次面试官问“BeanFactory 和 ApplicationContext 区别”,你 30 秒画完图 + 讲完,直接满分通过!冲!