面试知识库
基础

Spring-BeanFactory与ApplicationContext#

一句话答案#

BeanFactory 是基础容器(懒加载),ApplicationContext 是增强容器(预加载单例 + 事件/国际化/AOP/注解支持)。

核心要点

完整的 Bean 生命周期(14 步):

记忆要点:

  • AOP 代理在第⑩步(postProcessAfterInitialization)生成,不是第⑥步
  • 初始化顺序:@PostConstruct > afterPropertiesSet() > init-method
  • 销毁顺序:@PreDestroy > destroy() > destroy-method
面试回答(2分钟版)

BeanFactory和ApplicationContext是Spring IoC容器的两个核心接口,ApplicationContext继承自BeanFactory并做了大量增强。BeanFactory是最基础的容器,提供Bean的注册和获取能力,采用懒加载策略,getBean时才创建实例。ApplicationContext在此基础上增加了很多企业级特性:启动时预加载所有单例Bean提前暴露配置问题、支持事件发布机制、国际化、AOP自动代理、注解驱动等。实际开发中99%使用ApplicationContext。Bean的完整生命周期是面试重点:实例化、属性填充、Aware接口回调、BeanPostProcessor前置处理、@PostConstruct、afterPropertiesSet、自定义init-method、BeanPostProcessor后置处理,这个后置处理阶段就是AOP代理生成的时机。初始化顺序记住三步:@PostConstruct优先于afterPropertiesSet优先于init-method。销毁顺序同理:@PreDestroy优先于destroy方法优先于destroy-method。

追问与易错

追问方向:

  • “ApplicationContext 比 BeanFactory 多什么?”→ 启动时预加载所有单例 Bean、事件发布机制(ApplicationEvent)、国际化支持(MessageSource)、AOP 自动代理、注解驱动、资源加载(ResourceLoader)
  • “什么时候用 BeanFactory?”→ 极少直接使用,主要出现在资源受限的嵌入式环境或框架底层实现中;日常开发 99% 使用 ApplicationContext,它是 BeanFactory 的超集
  • “AnnotationConfigApplicationContext 流程?”→ 创建容器 → 注册配置类 → 调用 refresh()(核心12步)→ 扫描 @Component 类生成 BeanDefinition → 执行 BeanFactoryPostProcessor → 创建单例 Bean → 发布 ContextRefreshedEvent

易错点:

  • ❌ BeanFactory 不能创建 Bean——可以只是功能少
  • ❌ BeanFactory 已废弃——仍在使用