中 基础
Spring-BeanFactory与ApplicationContext#
一句话答案#
BeanFactory 是基础容器(懒加载),ApplicationContext 是增强容器(预加载单例 + 事件/国际化/AOP/注解支持)。
核心要点
完整的 Bean 生命周期(14 步):
① 实例化(Instantiation)
→ 通过构造函数或工厂方法创建 Bean 实例(此时属性都是默认值)
② 属性填充(Populate Properties)
→ 依赖注入:将 @Autowired / @Value 等注解的属性值注入 Bean
③ 调用 BeanNameAware.setBeanName()
→ 如果 Bean 实现了 BeanNameAware,注入 Bean 的 id/name
④ 调用 BeanFactoryAware.setBeanFactory()
→ 如果实现了 BeanFactoryAware,注入 BeanFactory
⑤ 调用 ApplicationContextAware.setApplicationContext()
→ 如果实现了 ApplicationContextAware,注入 ApplicationContext
⑥ 调用 BeanPostProcessor.postProcessBeforeInitialization()
→ 所有 BeanPostProcessor 的前置处理(可修改 Bean)
→ ✅ AOP 代理对象在此处创建(注意:是 postProcessAfterInitialization,即第⑩步)
⑦ 调用 @PostConstruct 方法(JSR-250)
→ 标注了 @PostConstruct 的方法在此执行
⑧ 调用 InitializingBean.afterPropertiesSet()
→ 如果实现了 InitializingBean,此方法在属性注入后执行
⑨ 调用自定义 init-method
→ XML 中 init-method 或 @Bean(initMethod="...") 指定的初始化方法
⑩ 调用 BeanPostProcessor.postProcessAfterInitialization()
→ 所有 BeanPostProcessor 的后置处理
→ ✅ AOP 代理在此步骤生成(AbstractAutoProxyCreator 实现此接口)
── Bean 可以正常使用 ──
⑪ 调用 @PreDestroy 方法(容器关闭前)
⑫ 调用 DisposableBean.destroy()
⑬ 调用自定义 destroy-methodplaintext记忆要点:
- 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 已废弃——仍在使用