Spring IoC与AOP核心原理揭秘

📅2026/7/12 4:19:01 👁️次浏览
Spring IoC与AOP核心原理揭秘
Java技术面试高频题整理 - Day 1今日知识点Spring IoC与AOP核心机制Spring IoC控制反转与AOP面向切面编程是Spring全家桶的核心基石也是Java后端面试中必考的高频深挖考点。多数开发者仅会使用框架进行CRUD操作但对底层原理认知浅薄难以应对中高级面试的源码提问。一、IoC控制反转核心原理1.1 核心概念IoC即控制反转是Spring的核心设计思想。它将对象创建、依赖管理的控制权从开发者反转给Spring容器实现组件解耦、统一管理和灵活复用。传统开发方式IoC容器方式开发者主动new对象容器自动创建、装配、管理对象高耦合、难维护低耦合、易扩展依赖关系硬编码依赖关系外部配置1.2 依赖注入三种方式① 构造器注入Spring官方推荐// 保证对象初始化完成、依赖不可变、避免空指针 public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository userRepository; } }② Set方法注入适合可选依赖、动态修改依赖场景。③ 字段注入不推荐生产使用写法简洁但耦合度高不利于单元测试。1.3 Bean完整生命周期实例化 → 依赖注入 → 初始化前置处理 → 初始化方法 → 初始化后置处理 → 存入单例池 → 销毁全程由Spring容器全权管理是面试高频源码考点。二、Spring三级缓存解决循环依赖2.1 循环依赖问题循环依赖是多Bean互相依赖导致的初始化死循环。Spring通过三级缓存机制完美解决单例Setter/字段注入循环依赖问题。2.2 三级缓存结构缓存级别存放内容作用一级缓存完整初始化完成的单例Bean正常获取Bean二级缓存已实例化、未完全初始化的Bean实例提前暴露引用三级缓存Bean工厂对象解决循环引用2.3 核心原理提前暴露未完成初始化的Bean引用打破循环依赖闭环保证Bean正常创建。⚠️注意仅支持单例、非构造器注入循环依赖。构造器注入循环依赖无法解决会直接报错。三、AOP面向切面编程3.1 核心概念AOP是面向切面编程在不修改原有代码的前提下对方法进行增强实现代码解耦、统一增强、复用通用逻辑。典型应用场景事务控制、日志记录、权限校验、性能监控。3.2 两种动态代理对比对比维度JDK动态代理CGLIB动态代理实现原理基于接口实现基于子类继承实现使用限制目标类必须实现接口可代理任意普通类性能差异高版本JDK性能持平低版本JDK更优Spring默认SpringBoot 2.0默认CGLIB无接口类自动选用局限性无接口无法代理无法代理final/private/static方法3.3 五种通知类型前置通知方法执行前后置通知方法执行后异常通知方法抛出异常时环绕通知功能最全可控制方法执行全程返回通知方法正常返回后四、Spring事务核心机制4.1 事务传播机制传播机制说明适用场景REQUIRED默认支持当前事务不存在则新建大多数业务场景SUPPORTS支持当前事务不存在则以非事务执行查询操作REQUIRES_NEW新建事务挂起当前事务独立日志记录NESTED嵌套事务复杂业务嵌套4.2 事务隔离级别读未提交 → 读已提交 → 可重复读 → 串行化逐级解决脏读、不可重复读、幻读问题。MySQL默认可重复读。4.3 事务失效七大场景高频坑点方法非public修饰同类内部方法调用绕过AOP代理异常被try-catch捕获未抛出异常事务传播机制配置错误多线程环境下事务互不感知数据库引擎不支持事务如MyISAM只读事务、超时触发事务回滚机制失效五、高频面试真题及标准答案Q1IoC的核心作用是什么答IoC将对象创建、依赖管理的控制权从开发者交给Spring容器。核心作用彻底解耦组件依赖统一管理Bean生命周期简化代码开发提升程序扩展性、维护性与灵活性是Spring框架的核心根基。Q2Spring如何解决循环依赖答Spring通过三级缓存提前暴露Bean引用解决单例Setter循环依赖。流程Bean实例化后存入三级缓存提前暴露引用被依赖Bean直接获取引用完成初始化后续逐级升级缓存打破循环依赖闭环。仅支持单例、非构造器注入循环依赖构造器循环依赖无法解决。Q3JDK动态代理和CGLIB动态代理的区别答实现原理JDK基于接口CGLIB基于继承子类重写方法使用限制JDK要求目标类实现接口CGLIB可代理任意普通类性能差异低版本JDK中CGLIB更优高版本二者持平Spring默认SpringBoot 2.0默认使用CGLIB局限性CGLIB无法代理final、private、static方法Q4Spring事务失效的常见场景有哪些答方法非public修饰同类内部方法调用绕过AOP代理异常被try-catch捕获事务传播机制配置错误多线程环境下事务互不感知数据库引擎不支持事务只读事务、超时触发回滚失效六、学习建议与避坑指南✅ 重点掌握三级缓存解决循环依赖原理两种动态代理区别及适用场景事务传播机制适配场景高频事务失效坑点❌ 常见误区认为字段注入是最佳实践实际不推荐忽视构造器注入循环依赖无法解决事务注解加在private方法上同类方法调用时忽略AOP代理绕过问题 延伸学习建议结合Spring源码深入理解Bean生命周期、三级缓存实现细节、AOP代理创建过程彻底掌握Spring框架底层运行逻辑。明日预告Java集合框架核心考点HashMap源码、ConcurrentHashMap并发机制、ArrayList与LinkedList对比参考来源适合中高级前端vue面试的100道题目及解析_vue.js_脚本之家Java面试通关⑧Spring核心IoC/AOP全集-CSDN博客Java中的final/finally/finalize与对象4种引用全解析_java_脚本之家第7篇工厂模式面试高频题与避坑指南-CSDN博客Java面试宝典从基础到架构9-CSDN博客【Java实习面试算法冲刺】哈希-CSDN博客