1. 基本概念
BeanFactory:
- Spring IoC 容器的基础接口(根接口)
- 提供最核心的容器功能
- 延迟加载 Bean(懒加载)
ApplicationContext:
- BeanFactory 的子接口,继承自 BeanFactory
- 提供更丰富的企业级功能
- 默认预加载所有单例 Bean
2. 继承关系
BeanFactory (基础接口)↑|ApplicationContext (扩展接口)↑|├── ClassPathXmlApplicationContext├── FileSystemXmlApplicationContext├── AnnotationConfigApplicationContext└── WebApplicationContext (用于 Web 应用)
3. 核心区别对比
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| 加载时机 | 延迟加载(懒加载) | 预加载(启动时加载) |
| 国际化 | 不支持 | 支持(MessageSource) |
| 事件发布 | 不支持 | 支持(ApplicationEventPublisher) |
| 资源访问 | 不支持 | 支持(ResourceLoader) |
| AOP 支持 | 基础支持 | 完整支持 |
| 生命周期管理 | 基础 | 完整(包括 BeanPostProcessor) |
| 配置方式 | XML | XML、注解、Java Config |
| 使用场景 | 轻量级应用 | 企业级应用 |
4. BeanFactory 特性详解
延迟加载:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));// 此时 Bean 还没有被创建MyBean bean = (MyBean) factory.getBean("myBean"); // 第一次获取时才创建
优点:
- 启动速度快
- 内存占用少
- 适合资源受限环境
缺点:
- 配置错误在运行时才发现
- 功能相对简单
5. ApplicationContext 特性详解
预加载:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 启动时所有单例 Bean 已经创建完成MyBean bean = context.getBean(MyBean.class);
扩展功能:
① 国际化支持
String message = context.getMessage("welcome.msg", null, Locale.CHINA);
② 事件发布
context.publishEvent(new CustomEvent("Something happened"));
③ 资源访问
Resource resource = context.getResource("classpath:config.properties");
④ 环境抽象
String activeProfile = context.getEnvironment().getActiveProfiles()[0];
6. 常见实现类
ApplicationContext 实现:
// 从类路径加载 XMLApplicationContext ctx1 = new ClassPathXmlApplicationContext("beans.xml");// 从文件系统加载 XMLApplicationContext ctx2 = new FileSystemXmlApplicationContext("D:/beans.xml");// 基于注解配置ApplicationContext ctx3 = new AnnotationConfigApplicationContext(AppConfig.class);// Web 应用WebApplicationContext ctx4 = ContextLoader.getCurrentWebApplicationContext();
BeanFactory 实现:
// 传统方式(已过时)BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));// 推荐方式:通过 ApplicationContext 获取BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
7. 使用建议
使用 BeanFactory 的场景:
- 资源受限的环境(如移动设备)
- 需要延迟加载的场景
- 只需要基本的 IoC 功能
使用 ApplicationContext 的场景(推荐):
- 绝大多数企业级应用
- 需要国际化、事件、AOP 等功能
- Web 应用开发
- Spring Boot 应用(默认使用)
8. 实际代码示例
BeanFactory 示例:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));UserService userService = (UserService) factory.getBean("userService");
ApplicationContext 示例:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 BeanUserService userService = context.getBean(UserService.class);// 发布事件context.publishEvent(new UserRegisteredEvent(user));// 获取国际化消息String msg = context.getMessage("user.registered", null, Locale.CHINA);// 获取资源Resource resource = context.getResource("classpath:application.properties");
一句话总结
BeanFactory 是 Spring 容器的基础接口,提供核心的 IoC 功能,采用延迟加载;ApplicationContext 是 BeanFactory 的增强版,提供更丰富的企业级功能,默认预加载 Bean,是实际开发中的首选。
正文完