ApplicationContext与BeanFactory的用法区别

ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心容器接口,虽然都用于管理 Bean,但在功能强度使用场景上有显著区别。以下是它们的详细用法对比:


1. 基础用法对比

(1) BeanFactory — 基础容器
  • 功能定位:最小化依赖注入和 Bean 生命周期管理。

  • 初始化方式

    // 需要手动加载资源
    Resource resource = new ClassPathResource("beans.xml");
    BeanFactory factory = new XmlBeanFactory(resource);
    
    // 获取 Bean(懒加载,首次调用时初始化)
    UserService userService = factory.getBean(UserService.class);
  • 特点

    • 懒加载:只有调用 getBean() 时才会实例化 Bean。

    • 无额外功能:不支持注解、AOP、事件等高级特性。

(2) ApplicationContext — 高级容器
  • 功能定位:在 BeanFactory 基础上扩展企业级功能。

  • 初始化方式

    // 自动加载并初始化所有单例 Bean(预加载)
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    
    // 直接获取已初始化的 Bean
    UserService userService = context.getBean(UserService.class);
    
    // 额外功能:事件发布
    context.publishEvent(new MyCustomEvent(context));
  • 特点

    • 预加载:启动时立即初始化所有单例 Bean。

    • 开箱即用:支持注解、AOP、国际化、资源访问等。


2. 核心功能差异

功能 BeanFactory ApplicationContext
Bean 加载时机 懒加载(按需初始化) 启动时预加载单例 Bean
注解支持 不支持(如 @Autowired 原生支持
AOP 集成 需手动配置 自动代理(如 @Aspect
事件机制 不支持 支持 ApplicationEvent 发布/监听
国际化(i18n) 不支持 通过 MessageSource 支持
资源访问 需手动处理 Resource 内置 ResourceLoader(如 classpath:
环境变量 支持 Environment 抽象(Profile、Property)

3. 代码场景示例

(1) 使用 BeanFactory 的场景
// 适用于资源受限环境(如嵌入式设备)
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
LazyService service = factory.getBean(LazyService.class); // 首次调用时初始化

适用场景

  • 需要精确控制 Bean 初始化时机。

  • 无需 Spring 的高级功能(如 AOP)。

(2) 使用 ApplicationContext 的场景
// 企业级应用标准用法
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// 自动注入依赖(@Service/@Autowired)
UserService userService = context.getBean(UserService.class);

// 发布事件(观察者模式)
context.publishEvent(new UserRegisteredEvent(user));

// 访问国际化消息
String message = context.getMessage("welcome", null, Locale.CHINA);

适用场景

  • 大多数 Spring 应用(包括 Spring Boot)。

  • 需要注解驱动、AOP、事务管理等高级功能。


4. 如何选择?

场景 推荐容器 理由
资源受限环境(内存/CPU 敏感) BeanFactory 轻量级,无额外开销。
常规企业应用 ApplicationContext 直接支持注解、AOP、事件等生产力特性。
需要懒加载控制 BeanFactory 精确管理 Bean 初始化时机。
快速开发(如 Spring Boot) ApplicationContext 默认容器,与自动配置无缝集成。

5. 底层关系

classDiagram
    BeanFactory <|-- ApplicationContext
    BeanFactory : +getBean()
    ApplicationContext : +getMessage()
    ApplicationContext : +publishEvent()
  • ApplicationContext 扩展了 BeanFactory,是其功能超集。

  • 实际开发中几乎总是使用 ApplicationContext(如 AnnotationConfigApplicationContextClassPathXmlApplicationContext)。


总结

  • BeanFactory:基础容器,适合对资源和控制权有严格要求的场景。

  • ApplicationContext:企业级容器,覆盖 99% 的 Spring 应用需求,推荐默认使用

  • 关键区别

    • 加载策略:懒加载 vs 预加载。

    • 功能范围:基础 DI vs 全栈支持(AOP、事件、国际化等)。

你可能感兴趣的:(java,开发语言)