复习向:Spring 7大核心面试题(IoC、循环依赖、生命周期、缓存、BeanFactory/FactoryBean、设计模式、AOP原理)

📅 发布时间:2026/8/11 14:26:22
复习向:Spring 7大核心面试题(IoC、循环依赖、生命周期、缓存、BeanFactory/FactoryBean、设计模式、AOP原理)
复习向Spring 7大核心面试题IoC、循环依赖、生命周期、缓存、BeanFactory/FactoryBean、设计模式、AOP原理摘要本文以面试者口吻围绕 Spring 框架最常被问的 7 个问题做结构化梳理IoC 理解、循环依赖的本质与解法、Bean 生命周期、一级缓存/二级缓存的放置与删除时机、BeanFactory 与 FactoryBean 差异、Spring 的常见设计模式、以及 AOP 的底层实现链路。目录谈谈对 Spring IoC 的理解Spring 如何解读“提前暴露对象”解决循环依赖描述一下 Bean 的生命周期Spring 中缓存的放置时间和删除时间BeanFactory 与 FactoryBean 的区别Spring 中用到的设计模式有哪些Spring AOP 底层实现原理1. 谈谈对 Spring IoC 的理解IoCInversion of Control控制反转在我理解里核心是把对象创建、依赖关系维护交给容器使用者只负责声明依赖不再手写 new 和依赖装配。1.1 IoC 解决了什么对象创建由容器根据配置/注解决定创建哪些 Bean依赖注入由容器完成字段/构造器/Setter 注入解耦与可替换同接口不同实现容器可灵活切换1.2 Spring IoC 的落地点Spring 内部通过BeanDefinition描述 Bean类型、作用域、依赖、初始化/销毁方法等通过BeanFactory更底层/ApplicationContext更上层来完成实例化、装配、生命周期管理面试总结口径我理解的 IoC 就是应用代码把“控制权”交给 Spring 容器由容器统一负责 Bean 的创建、装配、生命周期与扩展。2. Spring 是如何解读“额外循环依赖”问题循环依赖面试里说循环依赖我通常按“场景→机制→限制”来回答。2.1 循环依赖的典型场景构造器注入A(A依赖B)B(B依赖A)-无法通过提前暴露解决Setter/字段注入A - B且B - A-可以通过提前暴露三级缓存解决2.2 Spring 的核心思路提前暴露“半成品对象”当容器发现 A 正在创建但 A 被 B 依赖于是容器会先创建 A 的实例但未完成依赖注入把“半成品”放进缓存让后续注入可以拿到引用最终等 A 完成依赖注入与初始化后再把引用“补齐”到完成态这里的关键机制是 Spring 默认允许的单例循环依赖通过singletonFactories/earlySingletonObjects/singletonObjects三层缓存。2.3 三层缓存的面试口径概念级singletonObjects完整单例对象已初始化完成earlySingletonObjects提前暴露的早期对象半成品已能被注入singletonFactories用于生成早期对象的工厂常用于 AOP 场景2.4 常见限制构造器循环依赖不可用Spring 需要先有构造器参数才能 new多例prototype通常不支持循环依赖解决AOP 影响可能导致引用选择是否经过代理面试总结口径Spring 解决循环依赖的本质是对单例通过提前暴露“半成品对象”的引用让依赖注入不被卡住而构造器注入因为无法先 new 出实例所以天然不支持。3. 描述一下 Bean 的生命周期我一般从“Spring 默认单例生命周期 回调点”来讲。3.1 单例 Bean 生命周期关键阶段实例化Instantiation构造对象属性填充Populate Properties依赖注入可能触发循环依赖早期暴露Aware 回调如BeanNameAware、BeanFactoryAware等BeanPostProcessor 前置处理postProcessBeforeInitialization初始化回调InitializatonInitializingBean#afterPropertiesSetPostConstruct自定义init-methodBeanPostProcessor 后置处理postProcessAfterInitialization典型AOP 在这里为 Bean 创建代理放入缓存singletonObjects单例完成态销毁阶段Destroy容器关闭时触发DisposableBean#destroyPreDestroy自定义destroy-method面试总结口径我会把生命周期概括成实例化→注入→Aware→前置处理→初始化回调→后置处理AOP→加入单例池→容器关闭销毁。4. 缓存的放置时间和删除时间这题通常是考三级缓存什么时候 put、什么时候 clear。4.1 三级缓存放置时机单例循环依赖场景创建单例实例后把 A 的对象或其工厂放入三级缓存链路具体表现为先把生成“早期对象”的工厂放进singletonFactories若后续需要注入早期引用再从工厂拿到并放进earlySingletonObjects初始化完成后将最终对象放入singletonObjects完整态4.2 删除/清理时机初始化完成并从创建流程结束后清理singletonFactories中与该 bean 相关的工厂清理earlySingletonObjects中的早期对象引用并在内部状态上标记该 bean 已完全创建面试总结口径放置创建实例后半成品先进入三级缓存初始化完成后进入singletonObjects删除bean 完成初始化后清理earlySingletonObjects/singletonFactories。5. BeanFactory 和 FactoryBean 的区别5.1 BeanFactory 是什么Spring 容器的底层接口负责生产/管理 Bean常见实现DefaultListableBeanFactory5.2 FactoryBean 是什么一个“Bean 工厂的工厂”概念当容器发现某个 Bean 定义类型实现了FactoryBean容器不会直接返回 FactoryBean 本身而是调用FactoryBean#getObject()获取它生产的“真实 Bean”5.3 面试对比口径BeanFactory容器/工厂产出 Bean 的主体FactoryBean特殊 Bean 定义由容器调用它生成真正要注入的对象面试一句话BeanFactory 是容器FactoryBean 是容器里的一种 Bean 定义用来“生产”另一个对象。6. Spring 中用到的设计模式有哪些我一般列举“Spring 常见模式 每个模式一句话作用”。6.1 常见设计模式工厂模式BeanFactory、FactoryBeanBean 的创建与产品抽象模板方法模式生命周期回调流程比如初始化流程中固定骨架扩展点在特定回调代理模式AOP 运行期为目标对象创建代理适配器模式HandlerAdapter等思想在 Spring MVC 中常见在整体框架里也大量体现适配扩展点装饰器模式拦截器链/责任链风格的增强观察者模式ApplicationEvent及事件发布订阅面试总结口径我会把它归类为工厂/模板生命周期与创建、代理/装饰AOP 增强、观察者事件机制这些都是 Spring 的高频用法。7. Spring 的 AOP 底层实现原理我通常用链路串起来入口→匹配→拦截链→代理创建→调用时织入。7.1 关键参与者AOP相关Advisor、Advice通知、Pointcut切点BeanPostProcessorAnnotationAwareAspectJAutoProxyCreatorAOP 自动代理创建器7.2 大致实现链路概念级容器启动时AOP 相关的 BeanPostProcessor 注册创建 Bean 的过程中触发postProcessAfterInitialization根据切面信息匹配 Pointcut构建Advisor列表形成拦截器链advice - interceptor chain根据是否有接口选择代理方式有接口JDK 动态代理没接口CGLIB 代理生成子类业务方法调用时拦截器链依次执行形成 Around/Before/After 的织入效果面试总结口径Spring AOP 的本质是在 Bean 初始化后使用 BeanPostProcessor 判断是否需要代理并基于 Advisor/Advice 构建拦截器链通过 JDK/CGLIB 创建代理对象来完成方法增强。总结这 7 个问题我一般会用“概念→机制→限制/时机→面试一句话”来回答IoC把控制权交给容器循环依赖单例 setter 可通过三级缓存提前暴露半成品生命周期实例化/注入/Aware/前后置处理/初始化/销毁缓存创建后放三级缓存初始化完成后清理BeanFactory vs FactoryBean容器 vs 生产真实对象的工厂设计模式工厂/模板/代理/观察者等AOPBeanPostProcessor Advisor/Advice 拦截器链 JDK/CGLIB 代理参考方向Spring Framework 官方文档IoC 容器、AOP、Bean 生命周期《Spring 源码深度解析》相关章节DefaultSingletonBeanRegistry、AbstractAutowireCapableBeanFactory、AOP 代理创建