BeanFactory 是 Spring 最基础的 IoC 容器接口,仅提供获取 Bean、判断存在性等核心能力,默认懒加载且无企业级功能;ApplicationContext 是其子接口,预加载单例 Bean,原生支持环境配置、事件机制、资源加载、国际化及完整注解驱动。

BeanFactory 是 Spring 最基础的 IoC 容器接口,只管“造 Bean”;ApplicationContext 是它的子接口,不仅完全继承 BeanFactory 的能力,还自带一整套企业级功能,开箱即用。
核心定位不同
BeanFactory 是 Spring 容器体系的“根接口”,定义了最简能力:获取 Bean、判断是否存在、检查类型、管理单例缓存。它不主动做任何增强,设计目标是轻量、低开销、可嵌入底层框架(比如中间件、测试容器)。
ApplicationContext 则是面向业务开发的标准容器,Spring Boot 默认用的就是它。它在 BeanFactory 基础上叠加了环境配置、事件机制、资源加载、国际化、AOP 集成等关键能力,本质是一个“成品运行时上下文”。
Bean 初始化时机不同
BeanFactory 默认懒加载:只有第一次调用 getBean() 时才创建对应 Bean 实例。
ApplicationContext 默认预加载:容器启动时就初始化所有单例 Bean(可通过 @Lazy 单独控制)。
功能支持差异明显
以下能力 ApplicationContext 全都原生支持,而 BeanFactory 不具备或仅提供极简骨架:
- 环境与配置:通过 Environment 接口支持多 Profile(dev/test/prod)、@Value 注入、占位符解析
- 事件发布:实现 ApplicationEventPublisher,可发布/监听自定义事件(如订单创建后触发短信)
- 资源加载:集成 ResourceLoader,统一支持 classpath:、file:、http: 等路径资源读取
- 国际化:内置 MessageSource,自动按 Locale 返回本地化消息
- 注解驱动完整生效:@Autowired、@PostConstruct、@Transactional、@Scheduled 等依赖于后处理器(BeanPostProcessor),ApplicationContext 自动注册;BeanFactory 需手动注册,否则这些注解全部失效
实际使用建议
日常开发中几乎不用直接操作 BeanFactory:
- 写业务、Web 应用、微服务 → 一律用 ApplicationContext(如 AnnotationConfigApplicationContext、ClassPathXmlApplicationContext)
- 写单元测试或嵌入式工具类 → 若追求极简、避免启动耗时,可临时用 DefaultListableBeanFactory,但需自行注册后处理器才能启用注解
- XmlBeanFactory 已被标记为过时(@Deprecated),不应再使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











