Spring BeanFactory与ApplicationContext详解

通俗易懂!BeanFactory vs ApplicationContext 一次讲透(2025 面试 100% 会问,背完直接秒杀)

项目BeanFactoryApplicationContext谁才是你每天用的那个?
官方定位最原始、最底层的 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. 国际化 i18nMessageSource登录页面中英文自动切换
3. 资源加载ResourceLoaderclasspath:、file:、http: 随便读文件
4. 环境抽象Environment + @Profiledev/test/prod 三套配置自动切换
5. 自动刷新 + 预加载refresh() 一次性把所有单例 Bean 造好启动就准备好几千个 Bean,随时 getBean
6. AOP 自动代理自动识别 @Aspect 并织入@Transactional 直接生效
7. 生命周期管理自动调用 SmartLifecycle启动时自动连 Redis、MQ
8. 父子容器层级HierarchicalBeanFactorySpring + SpringMVC 两层容器
9. 配置属性绑定@ConfigurationPropertiesapplication.yml 自动绑到对象
10. 可观测性支持Micrometer Observation链路追踪自动采集

经典面试题 + 标准答案(直接背)

  1. BeanFactory 和 ApplicationContext 的区别?
    答:BeanFactory 是最基础的 IoC 容器,只提供 getBean 功能,懒加载。
    ApplicationContext 是它的加强超级版,启动就预加载所有单例 Bean,还额外提供事件、国际化、资源加载、Environment、AOP 等企业级功能。实际项目 100% 用 ApplicationContext。
  2. 你平时 new 的容器是哪个?
    答:在 Spring Boot 里根本不用自己 new,SpringBootApplication 启动后自动给我们一个 AnnotationConfigServletWebServerApplicationContext(名字很长,但就是 ApplicationContext 的子类)。
  3. 为什么几乎没人用 BeanFactory?
    答:因为它太原始了,懒加载导致第一次 getBean 很慢,而且没有事件、没有国际化、没有 @Profile,写企业项目根本用不爽。
  4. ApplicationContext 是线程安全的吗?
    答:容器本身是线程安全的,同一个 Bean(默认 singleton)在多线程下拿到的都是同一个实例。但 Bean 本身的线程安全要看你代码怎么写(无状态最好)。

一张图记住层级关系(面试画图必备)

ApplicationContext(你每天用的)
     ↑ 继承
ConfigurableApplicationContext
     ↑ 继承
AbstractApplicationContext
     ↑ 实现
BeanFactory(最底层接口,几乎不用)

实际项目里你见到的几种 ApplicationContext(记住名字就行):

场景容器全名备注
纯 Spring 项目AnnotationConfigApplicationContext手写 new 的时候用
Spring Boot WebAnnotationConfigServletWebServerApplicationContext自动创建,带内嵌 Tomcat
响应式 WebFluxAnnotationConfigReactiveWebServerApplicationContext用 Netty 启动
测试环境AnnotationConfigApplicationContext@SpringBootTest 里用

终极记忆口诀(背下来 10 秒答完)

“BeanFactory 是个光杆司令,只会造 Bean,懒汉一个;
ApplicationContext 是五星级酒店管家,一启动就把所有单例 Bean 造好,还包吃包住包娱乐(事件、国际化、资源、AOP),你上班天天住的就是它!”

记住这张表 + 这句口诀,
下次面试官问“BeanFactory 和 ApplicationContext 区别”,你 30 秒画完图 + 讲完,直接满分通过!冲!

文章已创建 3017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部