BeanFactory 和 application context区别​

8次阅读
没有评论

1. 基本概念

BeanFactory

  • Spring IoC 容器的基础接口(根接口)
  • 提供最核心的容器功能
  • 延迟加载 Bean(懒加载)

ApplicationContext

  • BeanFactory 的子接口,继承自 BeanFactory
  • 提供更丰富的企业级功能
  • 默认预加载所有单例 Bean

2. 继承关系

  1. BeanFactory (基础接口)
  2. |
  3. ApplicationContext (扩展接口)
  4. |
  5. ├── ClassPathXmlApplicationContext
  6. ├── FileSystemXmlApplicationContext
  7. ├── AnnotationConfigApplicationContext
  8. └── WebApplicationContext (用于 Web 应用)

3. 核心区别对比

特性 BeanFactory ApplicationContext
加载时机 延迟加载(懒加载) 预加载(启动时加载)
国际化 不支持 支持(MessageSource)
事件发布 不支持 支持(ApplicationEventPublisher)
资源访问 不支持 支持(ResourceLoader)
AOP 支持 基础支持 完整支持
生命周期管理 基础 完整(包括 BeanPostProcessor)
配置方式 XML XML、注解、Java Config
使用场景 轻量级应用 企业级应用

4. BeanFactory 特性详解

延迟加载

  1. BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
  2. // 此时 Bean 还没有被创建
  3. MyBean bean = (MyBean) factory.getBean("myBean"); // 第一次获取时才创建

优点

  • 启动速度快
  • 内存占用少
  • 适合资源受限环境

缺点

  • 配置错误在运行时才发现
  • 功能相对简单

5. ApplicationContext 特性详解

预加载

  1. ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
  2. // 启动时所有单例 Bean 已经创建完成
  3. MyBean bean = context.getBean(MyBean.class);

扩展功能

① 国际化支持

  1. String message = context.getMessage("welcome.msg", null, Locale.CHINA);

② 事件发布

  1. context.publishEvent(new CustomEvent("Something happened"));

③ 资源访问

  1. Resource resource = context.getResource("classpath:config.properties");

④ 环境抽象

  1. String activeProfile = context.getEnvironment().getActiveProfiles()[0];

6. 常见实现类

ApplicationContext 实现

  1. // 从类路径加载 XML
  2. ApplicationContext ctx1 = new ClassPathXmlApplicationContext("beans.xml");
  3. // 从文件系统加载 XML
  4. ApplicationContext ctx2 = new FileSystemXmlApplicationContext("D:/beans.xml");
  5. // 基于注解配置
  6. ApplicationContext ctx3 = new AnnotationConfigApplicationContext(AppConfig.class);
  7. // Web 应用
  8. WebApplicationContext ctx4 = ContextLoader.getCurrentWebApplicationContext();

BeanFactory 实现

  1. // 传统方式(已过时)
  2. BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
  3. // 推荐方式:通过 ApplicationContext 获取
  4. BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");

7. 使用建议

使用 BeanFactory 的场景

  • 资源受限的环境(如移动设备)
  • 需要延迟加载的场景
  • 只需要基本的 IoC 功能

使用 ApplicationContext 的场景(推荐):

  • 绝大多数企业级应用
  • 需要国际化、事件、AOP 等功能
  • Web 应用开发
  • Spring Boot 应用(默认使用)

8. 实际代码示例

BeanFactory 示例

  1. BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
  2. UserService userService = (UserService) factory.getBean("userService");

ApplicationContext 示例

  1. ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
  2. // 获取 Bean
  3. UserService userService = context.getBean(UserService.class);
  4. // 发布事件
  5. context.publishEvent(new UserRegisteredEvent(user));
  6. // 获取国际化消息
  7. String msg = context.getMessage("user.registered", null, Locale.CHINA);
  8. // 获取资源
  9. Resource resource = context.getResource("classpath:application.properties");

一句话总结

BeanFactory 是 Spring 容器的基础接口,提供核心的 IoC 功能,采用延迟加载;ApplicationContext 是 BeanFactory 的增强版,提供更丰富的企业级功能,默认预加载 Bean,是实际开发中的首选。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-04-24发表,共计2547字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)