Spring面试高频题解析:从IoC到AOP的完整攻略 📅 发布时间:2026/8/22 20:48:36 👁 浏览次数: 1. Spring面试高频题解析从基础到源码的完整攻略作为Java后端开发的核心框架Spring在技术面试中的出现频率高达90%以上。很多候选人在面对Spring相关问题时要么停留在表面概念要么陷入源码细节无法自拔。本文将带你系统梳理Spring面试中的核心考点从基础概念到源码实现再到实际应用中的避坑技巧帮你构建完整的知识体系。我见过太多候选人在这几个关键点上栽跟头能背出IoC的定义却说不出Spring容器解决循环依赖的具体策略知道AOP的概念却解释不清动态代理在Spring中的两种实现方式用过Transactional注解却分析不出事务失效的7种常见场景这些问题恰恰是面试官最关注的区分度考察点。接下来我们就从最基础的IoC容器开始逐步深入Spring的核心机制。2. IoC容器Spring的基石与高频考点2.1 IoC与DI的本质区别常被混为一谈的IoC(Inversion of Control)和DI(Dependency Injection)其实有明确区分IoC是设计原则将对象创建和绑定的控制权从代码转移到容器DI是实现方式通过构造函数、setter或字段注入实现依赖关系// 传统方式 - 主动创建依赖 class Service { private Repository repo new RepositoryImpl(); } // DI方式 - 被动接收依赖 class Service { private Repository repo; // 构造器注入 public Service(Repository repo) { this.repo repo; } }面试陷阱很多面试官会追问Spring使用的是哪种DI方式正确答案是三种都支持但推荐构造器注入特别是Spring 4.x之后因为保证依赖不可变final字段避免循环依赖问题更利于测试2.2 Bean生命周期全解析Bean的生命周期是必问题要能完整说出图中每个扩展点的触发时机和作用实例化 - 属性填充 - Aware接口回调 - 初始化前 - 初始化 - 初始化后 - 使用中 - 销毁前 - 销毁关键扩展点BeanPostProcessor影响所有Bean的全局处理器InitializingBean/DisposableBean针对单个Bean的生命周期回调PostConstruct/PreDestroyJSR-250标准注解实际案例面试时被问到如何实现Bean的延迟初始化除了配置lazy-init属性还可以通过BeanPostProcessor在初始化阶段拦截。2.3 循环依赖的解决策略Spring解决循环依赖的三级缓存机制是高频考点一级缓存singletonObjects存放完全初始化好的Bean二级缓存earlySingletonObjects存放原始对象未填充属性三级缓存singletonFactories存放ObjectFactory// 典型循环依赖场景 Service class A { Autowired B b; } Service class B { Autowired A a; }破解过程创建A对象半成品放入三级缓存注入B时发现需要A从三级缓存拿到A的引用B创建完成后注入AA完成初始化移入一级缓存重要限制构造函数循环依赖无法解决必须用setter/字段注入3. AOP原理与动态代理实战3.1 JDK动态代理 vs CGLIBSpring AOP的两种实现方式对比特性JDK动态代理CGLIB代理目标接口类性能创建快运行慢创建慢运行快依赖内置JDK需引入第三方库方法拦截只能拦截public方法能拦截final以外所有方法配置选择Spring Boot 2.x开始默认使用CGLIB可通过spring.aop.proxy-target-classfalse切换3.2 切面执行顺序控制当多个切面拦截同一方法时执行顺序很重要Aspect Order(1) // 数字越小优先级越高 class LogAspect {...} Aspect Order(2) class AuthAspect {...}执行流程LogAspect BeforeAuthAspect Before目标方法执行AuthAspect AfterLogAspect After常见坑点不要依赖Order的数值大小而应该用枚举或常量明确定义优先级3.3 AOP失效场景分析以下情况会导致AOP不生效同类方法自调用绕过代理public void a() { b(); // 直接调用不走代理 } Transactional public void b() {...}静态方法无法被代理final方法CGLIB无法代理非Spring管理的对象解决方案通过AopContext获取当前代理对象((AService)AopContext.currentProxy()).b();4. 事务管理的深度剖析4.1 事务传播行为详解7种传播行为是面试必考项重点掌握REQUIRED默认当前有事务则加入没有则新建REQUIRES_NEW总是新建事务挂起当前事务NESTED在当前事务内嵌套子事务SUPPORTS有事务则加入没有则以非事务运行NOT_SUPPORTED以非事务方式执行挂起当前事务NEVER必须在非事务环境执行否则抛异常MANDATORY必须在事务中执行否则抛异常实际案例在批量处理中某个子操作失败不应影响整体可以这样配置Transactional(propagation Propagation.REQUIRED) public void batchProcess() { // 主逻辑... try { subOperation(); } catch (Exception e) { // 记录日志但继续执行 } } Transactional(propagation Propagation.REQUIRES_NEW) public void subOperation() {...}4.2 事务失效的7种常见场景自调用问题同AOP失效异常类型不匹配默认只回滚RuntimeExceptionTransactional(rollbackFor Exception.class) // 修正方案异常被捕获未抛出非public方法数据库引擎不支持如MyISAM多线程环境下事务上下文丢失Transactional注解被覆盖子类重写父类方法时4.3 事务隔离级别对比Spring支持的标准隔离级别级别脏读不可重复读幻读性能READ_UNCOMMITTED×××最高READ_COMMITTED√××高REPEATABLE_READ√√×中SERIALIZABLE√√√最低MySQL默认REPEATABLE_READOracle默认READ_COMMITTED5. Spring Boot自动配置原理5.1 EnableAutoConfiguration解密自动配置的核心流程从META-INF/spring.factories加载自动配置类过滤掉不符合Conditional条件的配置按AutoConfigureOrder排序后应用自定义Starter步骤创建autoconfigure模块添加Configuration配置类定义META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports5.2 条件注解的应用常用条件注解ConditionalOnClass类路径存在指定类时生效ConditionalOnMissingBean容器中没有指定Bean时生效ConditionalOnProperty配置参数满足条件时生效ConditionalOnWebApplicationWeb环境时生效调试技巧启动时添加--debug参数可以看到自动配置的匹配情况5.3 自动配置的常见问题配置冲突多个Starter定义了相同Bean解决方案使用Primary或明确排除加载顺序问题解决方案使用AutoConfigureOrder调整条件判断不符合预期检查--debug输出确认条件匹配情况6. Spring源码阅读指南6.1 核心模块入口高效阅读源码的顺序建议org.springframework.contextApplicationContext接口体系BeanDefinition解析org.springframework.beansBeanWrapper属性访问类型转换系统org.springframework.aop代理创建流程拦截器链执行org.springframework.transaction事务拦截器事务管理器6.2 设计模式应用Spring中经典的设计模式实现工厂模式BeanFactory模板方法JdbcTemplate代理模式AOP实现观察者模式ApplicationEvent策略模式Resource接口体系面试技巧当被问到设计模式时不要只背概念要结合Spring的具体实现来讲6.3 源码调试技巧从单元测试入手spring-test模块使用条件断点如只拦截特定Bean的创建重点关注扩展接口BeanPostProcessorBeanFactoryPostProcessorAware接口族7. 高频面试题深度解析7.1 经典问题集锦Spring如何处理线程安全问题答案默认单例需要自己保证线程安全原型模式每次新建Autowired和Resource区别Autowired按类型装配Resource默认按名称Spring MVC处理请求的流程DispatcherServlet - HandlerMapping - HandlerAdapter - ViewResolver7.2 场景分析题案例系统突然出现事务不生效如何排查排查步骤检查方法是否为public确认异常类型是否被正确处理查看数据库引擎是否支持检查是否同类自调用添加--debug查看事务拦截器是否生效7.3 性能优化相关减少Bean的初始化时间延迟初始化避免复杂PostConstruct逻辑AOP优化精确指定切点表达式避免在切面中做耗时操作循环依赖优化尽量避免使用setter注入替代构造器注入8. 实战中的避坑经验8.1 配置相关陷阱属性覆盖问题application.properties application.yml后加载的配置会覆盖前者环境变量优先级命令行参数 系统环境变量 配置文件配置加密使用jasypt等工具避免明文存储敏感信息8.2 性能调优技巧合理使用Bean作用域无状态服务用singleton有状态考虑request/session优化组件扫描路径精确指定basePackages使用excludeFilters排除缓存反射元数据设置spring.beans.cachetrue8.3 最佳实践建议统一异常处理使用ControllerAdvice定义业务异常体系接口版本控制路径版本/v1/api参数版本/api?version1监控集成Spring Boot Actuator自定义健康检查