在Spring框架中,BeanFactory
和ApplicationContext
是容器的核心接口,二者是继承关系,但功能和使用场景有显著区别。以下是关键点总结:
1. 继承关系
ApplicationContext
是BeanFactory
的子接口
ApplicationContext
在BeanFactory
基础能力上扩展了更多企业级功能。
2. 核心功能对比
特性 | BeanFactory | ApplicationContext |
---|---|---|
Bean加载方式 | 懒加载(按需实例化Bean) | 预加载(启动时实例化所有单例Bean) |
AOP与事务支持 | 需手动配置 | 内置集成(如 @Transactional 注解生效) |
事件发布机制 | 不支持 | 支持(ApplicationEventPublisher ) |
国际化支持 | 不支持 | 支持(MessageSource ) |
资源访问 | 基础支持 | 扩展支持(如 ResourceLoader 加载文件) |
环境配置 | 无 | 支持(Environment 读取配置文件) |
注解驱动开发 | 需额外配置 | 原生支持(如 @ComponentScan ) |
3. 代码示例
// 使用 BeanFactory
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyBean bean = factory.getBean(MyBean.class);
// 使用 ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean bean = context.getBean(MyBean.class);
4. 使用场景
BeanFactory
适用场景
资源受限环境(如移动设备),需严格控制内存占用。ApplicationContext
适用场景
绝大多数应用(Spring Boot默认使用),需要完整企业级功能。
5. 关键结论
ApplicationContext
是功能增强版的BeanFactory
,提供开箱即用的企业特性。- 实际开发中几乎总是使用
ApplicationContext
,因其简化配置并支持现代Spring特性(如注解驱动、AOP)。 BeanFactory
是底层接口,ApplicationContext
的实现类(如AnnotationConfigApplicationContext
)在其基础上构建。
💡 扩展理解:
可将BeanFactory
视为基础容器(提供依赖注入核心能力),而ApplicationContext
是企业级容器(整合Spring生态,提供一站式解决方案)。两者共同支撑Spring的IoC功能,但后者是实际开发的标准选择。