Java面试通关⑧:Spring核心IoC/AOP全集

📅 2026/7/4 20:22:34 👁️ 阅读次数 📝 编程学习
Java面试通关⑧:Spring核心IoC/AOP全集

📖 前言导读

Spring IoC与AOP是Spring全家桶的核心基石、面试高频深挖考点,也是框架源码学习的入门核心,几乎所有Spring面试必问。多数开发者只会框架CRUD使用,对IoC容器原理、Bean生命周期、循环依赖、AOP动态代理、事务底层机制认知浅薄,无法应对中高级面试源码提问。本篇深度拆解Spring核心两大机制,全覆盖容器原理、依赖注入、三级缓存、动态代理、事务传播与隔离级别、事务失效场景,搭配源码解析、生产避坑、高频真题,吃透Spring底层核心,摆脱CRUD程序员标签


一、IoC控制反转核心原理

📌 必考指数:★★★★★

IoC即控制反转,是Spring核心设计思想,将对象创建、依赖管理的控制权从开发者反转给Spring容器,实现组件解耦、统一管理、灵活复用。传统开发主动new对象高耦合,IoC容器自动创建、装配、管理对象,大幅降低代码依赖。

1、依赖注入三种方式

  • 构造器注入:Spring官方推荐,保证对象初始化完成、依赖不可变、避免空指针

  • Set方法注入:适合可选依赖、动态修改依赖场景

  • 字段注入:写法简洁,不推荐生产使用,耦合度高、不利于单元测试

2、Bean完整生命周期

实例化 → 依赖注入 → 初始化前置处理 → 初始化方法 → 初始化后置处理 → 存入单例池 → 销毁,全程由Spring容器全权管理,是面试高频源码考点。


二、Spring三级缓存解决循环依赖

📌 必考指数:★★★★★

循环依赖是多Bean互相依赖导致的初始化死循环,Spring通过三级缓存机制完美解决单例Setter/字段注入循环依赖问题。

  • 一级缓存:存放完整初始化完成的单例Bean

  • 二级缓存:存放已实例化、未完全初始化的Bean实例

  • 三级缓存:存放Bean工厂对象,提前暴露Bean引用,解决循环引用

核心原理:提前暴露未完成初始化的Bean引用,打破循环依赖闭环,保证Bean正常创建。构造器注入循环依赖无法解决,直接报错。


三、AOP面向切面编程

📌 必考指数:★★★★★

AOP是面向切面编程,在不修改原有代码的前提下,对方法进行增强,实现代码解耦、统一增强、复用通用逻辑,典型场景:事务控制、日志记录、权限校验、性能监控。

1、动态代理两种方式

  • JDK动态代理:基于接口实现,只能代理接口实现类,无接口无法使用

  • CGLIB动态代理:基于子类继承实现,无需接口,可代理所有类,Spring默认优先CGLIB

2、AOP核心组件

切点、切面、通知、连接点,前置通知、后置通知、异常通知、环绕通知五种通知类型,环绕通知功能最全、可控制方法执行全程。


四、Spring事务核心机制

📌 必考指数:★★★★★

Spring事务基于AOP动态代理实现,无需手动管理事务提交回滚,极大简化事务开发。核心考点:传播机制、隔离级别、事务失效场景

1、七种事务传播机制

核心常用:REQUIRED默认传播、SUPPORTS支持事务、REQUIRES_NEW新建事务、NESTED嵌套事务,适配不同业务嵌套场景。

2、四种事务隔离级别

读未提交、读已提交、可重复读、串行化,逐级解决脏读、不可重复读、幻读问题,MySQL默认可重复读。

3、常见事务失效场景

非public方法、内部调用、异常被捕获、传播机制配置错误、多线程事务、数据库不支持事务,以上场景均会导致事务失效,是生产高频坑点。


五、本篇高频面试真题(必背)

1、IoC控制反转的核心思想与作用?

IoC即控制反转,将对象创建、依赖管理的控制权从开发者交给Spring容器。核心作用:彻底解耦组件依赖,统一管理Bean生命周期,简化代码开发,提升程序扩展性、维护性与灵活性,是Spring框架的核心根基。

2、Spring三级缓存如何解决循环依赖?

Spring通过三级缓存提前暴露Bean引用解决单例Setter循环依赖。流程:Bean实例化后存入三级缓存,提前暴露引用,被依赖Bean直接获取引用完成初始化,后续逐级升级缓存,打破循环依赖闭环。仅支持单例、非构造器注入循环依赖,构造器循环依赖无法解决。

3、Spring事务常见失效场景有哪些?

1、方法非public修饰;2、同类内部方法调用,绕过AOP代理;3、异常被try-catch捕获,未抛出异常;4、事务传播机制配置错误;5、多线程环境下事务互不感知;6、数据库引擎不支持事务(如MyISAM);7、只读事务、超时触发事务回滚机制失效。以上场景是生产开发中最常见的事务失效坑点,开发需严格规避。

4、JDK动态代理和CGLIB代理的区别?

1、实现原理:JDK动态代理基于接口实现,CGLIB基于继承子类重写方法实现;2、使用限制:JDK代理要求目标类必须实现接口,无接口无法代理,CGLIB可代理任意普通类;3、性能差异:低版本JDK中CGLIB性能更优,高版本二者性能持平;4、Spring默认规则:SpringBoot2.0+默认使用CGLIB代理,无接口类自动选用CGLIB,有接口类可配置切换;5、局限性:CGLIB无法代理final、private、static方法,无法继承final类。

5、Spring七种事务传播机制详细说明?

1、REQUIRED(默认):当前有事务则加入,无则新建事务,最常用;2、SUPPORTS:当前有事务则加入,无则以非事务运行;3、MANDATORY:强制要求在事务内运行,无事务直接报错;4、REQUIRES_NEW:新建独立事务,暂停当前已有事务,互不影响;5、NOT_SUPPORTED:始终以非事务方式运行,挂起当前事务;6、NEVER:强制非事务运行,检测到事务直接报错;7、NESTED:嵌套事务,依赖父事务,父事务回滚子事务必回滚,子事务回滚不影响父事务。


📝 本篇章节小结

本篇全方位吃透Spring IoC核心原理、依赖注入方式、Bean生命周期、三级缓存循环依赖、AOP动态代理、七大事务传播机制、四大隔离级别、事务失效场景等Spring核心重难点。这部分内容是Spring框架底层核心,也是中高级面试必考深挖模块。重点掌握三级缓存解决循环依赖原理、两种动态代理区别、事务传播机制适配场景、高频事务失效坑点,彻底理解Spring框架底层运行逻辑,告别只会用不会原理的开发短板,从容应对Spring源码面试、生产事务问题排查与复杂业务场景开发。