Spring面试题核心解析:IoC生命周期、自动配置与事务原理
Spring面试题是Java岗位面试里绕不开的一道坎。这几年我整理过不少面试真题也面过很多候选人发现Spring考察早就不停留在“用没用过”的层面而是开始深挖“为什么这么设计”“底层怎么实现”。这篇是Spring系列面试题整理的第二篇我会把IoC和Bean生命周期、Boot自动配置、事务与AOP、MVC请求链路、微服务常见问题这五个方向的高频题拆开讲每题配上答题思路和面试官大概率会追问的坑。适合正在准备校招、社招的Java后端工程师也适合想系统补底层细节的在职开发。1. Spring IoC面试高频题Bean生命周期和三级缓存1.1 Bean生命周期别只会背方法名要讲出阶段之间的因果关系面试官问“Bean生命周期”的时候大多数候选人能背出实例化、属性填充、初始化、销毁这几个词。但真正能拉开差距的是能不能讲清楚哪些阶段会回调什么接口以及这些回调发生在什么时机。完整链路大致是这样的Spring容器启动后会扫描BeanDefinition然后开始创建Bean实例。先通过构造器实例化对象然后做属性填充也就是依赖注入接着会处理Aware接口比如BeanNameAware、BeanFactoryAware、ApplicationContextAware随后进入BeanPostProcessor的初始化前置处理这一步非常关键AOP代理对象就是在后置阶段被创建出来的。再往下是InitializingBean和init-method最后是BeanPostProcessor的后置处理。我建议你在面试时重点落在两处第一处是“BeanPostProcessor后置方法里会做AOP代理”第二处是“Aware接口的作用是让Bean感知容器资源”。这两个点能自然串联到后面面试官可能要问的“Spring AOP什么时候生成代理”“循环依赖怎么解决”。第二个常用的死记硬背技巧是分清BeanPostProcessor和InitializingBean的区别。后者是初始化Bean自身时的回调前者是容器统一对每个Bean做增强的扩展点。面试官只要听到你能区分这两个概念基本上就会认为你不是只会背八股的人。这里补一个我实际面试时经常追问的细节如果同时配置了PostConstruct、InitializingBean、init-method它们执行的先后顺序是什么答案是PostConstruct先执行然后是InitializingBean的afterPropertiesSet最后才是init-method。这个顺序在Spring文档里写得很清楚但踩过坑的人才知道它重要所以可以特意记一下。1.2 三级缓存为什么是三级二级不行吗三级缓存是Spring面试题里的老面孔几乎人人都知道singletonObjects、earlySingletonObjects、singletonFactories这三张表但被问到“为什么一定要三级缓存”时很多人答不上来。先说结论三级缓存存在的根本原因是Spring既要解决setter注入的循环依赖又要保证最终暴露出去的Bean是经过AOP代理增强的对象同时还要避免在创建过程中过早生成代理对象。如果只用二级缓存直接把Bean提前放入早期缓存那么后续创建AOP代理时就会出现“原始对象和代理对象不一致”的问题。我用A依赖B、B依赖A这个经典场景来复述整个流程。A开始创建时实例化之后发现需要B就把A的工厂方法放入第三级缓存singletonFactories然后去创建BB在属性填充阶段发现需要A此时从第三级缓存里拿到A的工厂方法调用getEarlyBeanReference提前暴露A的引用B拿到A的早期引用后完成自己的创建并把A的引用存入第二级缓存A接着从二级缓存或创建结果里拿到B的引用继续完成自己的属性填充和初始化最后把代理后的A放入第一级缓存。这里有个高频追问为什么第三级缓存要存ObjectFactory而不是直接存Bean因为Spring需要在这个时机决定要不要提前生成AOP代理。getEarlyBeanReference会调用SmartInstantiationAwareBeanPostProcessor如果此时判断这个Bean需要代理就提前创建代理对象如果不需要就直接返回原始对象。二级缓存做不到这一步因为存进去的只能是具体对象没法延迟决策。我把三层缓存的职责整理成一个对照表面试前可以快速过一遍缓存层级名称存放内容作用一级singletonObjects完成初始化的完整单例Bean最终获取Bean的入口二级earlySingletonObjects提前暴露的早期Bean引用保存已暴露但未完成初始化的Bean三级singletonFactoriesBean工厂方法ObjectFactory延迟判断是否需要生成AOP代理另外要记住Spring Boot 2.6之后默认不允许循环依赖这是很多人忽略的点。面试官会继续问“那你们项目里的循环依赖怎么办”你最好回答优先重构代码消除循环依赖而不是开spring.main.allow-circular-referencestrue去规避。实在改不动旧代码再开放这个开关但需要接受该开关带来的长期维护成本。1.3 手写三级缓存图示面试时这样讲最清楚如果你在面试中需要快速把三级缓存讲明白我建议不要硬背文字而是用一段伪代码辅助表达。面试官听了你说“三级缓存存的是工厂方法”通常会让你画一下流程这时候你在白板上写下类似这样的小结构比纯嘴说效果好很多。MapString, Object singletonObjects new ConcurrentHashMap(); MapString, Object earlySingletonObjects new ConcurrentHashMap(); MapString, ObjectFactory? singletonFactories new ConcurrentHashMap();然后对着这个逻辑讲实例化后往第三级放工厂循环依赖出现时从第三级拿工厂取早期引用早期引用放到第二级最终创建完成后把完整Bean放到第一级。记住核心一句话“第三级延迟代理生成第二级保存提前暴露的Bean第一级提供最终结果。”还有一个细节点容易加分构造器注入解决不了循环依赖因为构造器执行阶段对象还没完成实例化Spring根本没有机会提前暴露引用。面试官如果问“为什么Autowired默认是byType”可以从依赖查找的角度顺带说一句Spring容器里的单例对象有缓存链路循环依赖处理时依赖的是对象引用而不是重新创建这就解释了为什么不建议在构造器里搞循环依赖。2. Spring Boot自动配置与启动流程高频考点拆解2.1 自动配置原理条件注解是怎么一步步生效的Spring Boot自动配置应该是面试中出现频率最高的Spring Boot问题没有之一。如果你只回答“通过EnableAutoConfiguration导入配置”那基本等于没答。面试官想听的是整条链路。先记住SpringBootApplication是一个组合注解核心是SpringBootConfiguration、EnableAutoConfiguration和ComponentScan。其中真正做自动配置的是EnableAutoConfiguration它通过Import引入了AutoConfigurationImportSelector这个类会去读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports或者老版本里的META-INF/spring.factories文件把你项目里引入的依赖对应的自动配置类全部加载出来。关键在于加载出来的配置类不会全部生效而是要根据一系列Conditional条件注解做判断。比如ConditionalOnClass判断类路径是否存在某个类ConditionalOnMissingBean判断当前容器是否已有同类型BeanConditionalOnProperty判断配置项是否满足条件。这三者组合起来就实现了“你在项目里引入了Redis的依赖才触发RedisAutoConfiguration”。举一个最常见的DataSource例子项目里引入spring-boot-starter-data-jpa并配置了数据库连接DataSourceAutoConfiguration就会生效同时DataSourceProperties会读取spring.datasource.*配置最终生成一个DataSource Bean。如果项目里没有依赖或者你手动配置了Bean条件注解不让自动配置生效从而保证用户自定义配置优先级更高。回答自动配置原理时建议按这个链路走组合注解 -AutoConfigurationImportSelector- 读取配置文件 - 条件注解过滤 - 生成配置类 - 创建Bean。把链路背熟之后不管面试官从哪个节点打断追问你都能接得住。2.2 自定义Starter怎么讲才出彩面试官问“你用过哪些Spring Boot Starter”之后通常会加一个进阶问题“如果让你写一个自己的Starter你会怎么设计”这个问题不只是考察写代码而是在验证你理解不理解自动配置的边界。一个合格的Starter通常会分成两个模块一个是xxx-spring-boot-autoconfigure负责写自动配置类另一个是xxx-spring-boot-starter只负责引入autoconfigure模块和相关依赖。用户引入Starter之后Spring Boot就会自动加载autoconfigure模块里的配置类。命名规范是spring-boot-starter-xxx比如自定义一个发短信的Starter可以叫spring-boot-starter-sms。配置类需要放在独立的包路径下然后在AutoConfiguration.imports里注册。注册文件内容就是自动配置类的全限定类名每行一个。这里给一段简化的自动配置类示例AutoConfiguration ConditionalOnClass(SmsSender.class) EnableConfigurationProperties(SmsProperties.class) public class SmsAutoConfiguration { Bean ConditionalOnMissingBean public SmsSender smsSender(SmsProperties properties) { return new DefaultSmsSender(properties); } }后面这个类会通过配置文件被加载条件判断通过后再把Bean注入容器。如果用户自己已经定义了同名BeanConditionalOnMissingBean就会让自动配置的这个Bean不生效既做到了开箱即用又不覆盖用户自定义。我实际踩过的一个坑是自动配置类里写条件注解时范围写太宽结果在不需要它的项目中也生效导致启动时多创建了不少无用Bean。所以我的建议是ConditionalOnClass和ConditionalOnProperty一起用能精确控制生效条件。面试时讲出这个细节会让面试官觉得你是有项目实践经验的人而不是只看过文档。2.3 启动流程SpringApplication.run到底做了什么Spring Boot启动流程比自动配置更难答因为涉及容器刷新、监听器机制、环境准备等多个阶段。面试官通常不会要求你背完整源码但至少要能说清楚主流程。SpringApplication.run的核心步骤可以压缩成六步推断应用类型判断当前项目是普通Java应用、Servlet Web应用还是响应式Web应用。加载所有META-INF/spring.factories中的ApplicationContextInitializer和ApplicationListener准备监听器。准备Environment对象收集系统环境变量、JVM参数、application.yml配置。创建对应的ApplicationContext容器比如AnnotationConfigServletWebServerApplicationContext。调用容器的refresh方法执行BeanDefinition的加载、BeanPostProcessor注册、单例Bean创建。发布ApplicationReadyEvent输出Spring Boot启动成功日志。面试时重点说第五步的refresh因为这里涉及Spring Framework的老底子。讲讲invokeBeanFactoryPostProcessors会处理配置类解析registerBeanPostProcessors会把所有增强器注册进容器finishBeanFactoryInitialization会实例化所有非懒加载单例Bean。把这三板和启动流程串起来回答的层次会明显不一样。面试官可能会追问“项目启动慢你怎么排查”这里我补充一些实际经验看是不是自动配置加载了太多无关模块可以用spring.autoconfigure.exclude排除看是不是有非懒加载Bean初始化耗时太高可以开启懒加载spring.main.lazy-initializationtrue但要注意这也会延迟写慢查询日志或定时任务的加载再看日志级别降到INFO后是否能看到每个Bean的创建耗时必要时用SpringApplicationRunListener做阶段耗时的埋点。不要一上来就换版本或者加机器先定位瓶颈再动手。3. Spring事务与AOP实现原理和失效场景3.1 事务失效的五个经典场景几乎是必问Spring事务失效是面试中的大热门因为它能同时考察你对代理模式、事务传播行为和底层异常处理的理解。我总结出五个在实际项目里最容易出现的问题场景每个都能和面试官聊出火花。第一个是自调用失效。在同一个类的方法A里直接调用了方法B方法B加了Transactional结果事务没生效。原因很简单Spring事务是靠代理对象生效的外部调用通过代理进入方法B方法才能被事务切面包裹而同类内部调用走的是this对象没有经过代理注解上的事务配置自然不会被解析。第二个是方法不是public。Spring官方文档里写明Transactional只能放在public方法上因为AOP实现是基于代理类增强的非public方法的可见性限制导致代理无法拦截。如果面试官问为什么可以说一句“代理生成的对象需要能在外部被调用private方法不具备这样的访问条件”答案就完整了。第三个是异常被捕获了。代码里用try-catch把方法内的异常吞掉事务感知不到任何异常就正常提交了。这个场景在真实项目里很常见很多人以为只要方法上加了事务注解就万事大吉结果数据还是写进去了。第四个是抛出了检查异常但没指定rollbackFor。Spring默认只回滚RuntimeException和Error如果你在方法里抛的是IOException事务不会回滚。解决方式是显式声明Transactional(rollbackFor Exception.class)。第五个是多线程调用问题。子线程里调用了事务方法主线程的事务不一定传递给子线程Transactional默认不会自动传播到新线程里。这类问题不好排查面试时能主动说出来会让面试官觉得你对线程模型有概念。我把这些场景整理成一张速查表复习时对照着看场景表面现象根本原因正确做法同类自调用事务没生效调用没有经过代理对象拆分方法到另一个Bean或用AopContext.currentProxy方法非public事务没生效代理无法拦截私有方法改为public方法异常被catch事务提交了事务切面感知不到异常不要吞异常或手动回滚抛检查异常事务提交了默认只回滚运行时异常指定rollbackFor子线程调用部分数据未回滚事务与线程绑定使用编程式事务或靠消息补偿3.2 事务传播行为用“下单送积分”讲透REQUIRED和REQUIRES_NEWSpring定义了七种事务传播行为面试中问得最多的就是REQUIRED和REQUIRES_NEW。如果你只背“支持当前事务如果不存在则创建”面试官马上会追一个具体场景这时候大多数人就卡住了。我习惯用一个业务场景来串用户在商城下单主事务需要把订单数据写入订单表同时调用积分服务增加用户积分。显然订单操作和积分操作都需要事务保护但二者的关系要权衡。如果积分增加失败订单要不要一起回滚如果希望积分失败不影响订单就需要把积分调用放在独立事务里也就是REQUIRES_NEW如果积分是下单的核心链路任何一个失败都要回滚那就用默认的REQUIRED。代码结构类似这样Service public class OrderService { Transactional public void createOrder() { orderMapper.insert(); pointService.addPoint(); } } Service public class PointService { Transactional(propagation Propagation.REQUIRES_NEW) public void addPoint() { pointMapper.insert(); } }这里REQUIRED的意思是如果当前没有事务就创建一个如果调用链上游已经有事务就直接加入让上游和当前方法处于同一事务里。REQUIRES_NEW则是无论上游有没有事务都挂起当前事务再新开一个独立的事务外层事务失败不影响内层这个新事务的提交。还有一个容易被追问的是NESTED和REQUIRES_NEW的区别。NESTED是嵌套事务基于数据库的savepoint实现内层事务回滚时只回滚到保存点不会直接搞挂外层事务REQUIRES_NEW是彻底的开一个新事务和外部事务完全隔离。实际项目中我建议优先用REQUIRES_NEW去拆分独立事务因为它更直观NESTED依赖数据库特性不同数据库表现有差异排查问题更复杂。面试时如果想把传播行为答出彩最好顺带提一句“传播行为没有绝对正确要看业务对数据一致性要求”。这句话能体现出你不是死记硬背而是真的做过技术选型。3.3 AOP代理机制JDK动态代理和CGLIB怎么选Spring AOP是事务的基础所以面试官在问完事务失效之后经常会补一个“JDK动态代理和CGLIB有什么区别”。这个问题不算难但很多人回答时太机械。JDK动态代理基于接口只对接口方法做代理底层用Proxy.newProxyInstanceCGLIB基于继承在运行期生成被代理类的子类所以无需接口也能代理。Spring Boot 2.x开始默认使用CGLIB原因是现代开发中大量场景需要代理类而不是代理接口比如配置类里返回具体类型的情况JDK动态代理处理起来反而受限。面试官真正想听的是为什么默认选择了CGLIB以及JDK动态代理失效的场景。你可以这样回答JDK动态代理要求目标类必须有接口如果没有接口就只能用CGLIBCGLIB通过继承实现因此final类和方法无法被代理。Spring Boot选择CGLIB作为默认策略本质上是为了降低使用门槛让开发人员不需要为了代理而特意抽接口。这里可以接回事务失效话题自调用失效的本质就是因为通过this调用没有经过代理对象JDK动态代理或CGLIB生成的代理对象都是在容器中对原始Bean进行包裹。如果面试官问“那你项目里怎么避免AOP失效”除了拆分方法也可以用AopContext.currentProxy()拿到当前代理对象但需要配置EnableAspectJAutoProxy(exposeProxy true)。这个操作并不常用但说出来能证明你对AOP的坑有真实了解而不是停留在概念层。4. Spring MVC执行流程与Web层必问考点4.1 一个HTTP请求到Controller的完整路径怎么讲清晰Spring MVC执行流程是所有Java Web岗位面试中大概率会出现的问题。很多人喜欢背名词比如DispatcherServlet、HandlerMapping、HandlerAdapter但讲不出顺序和每一步的作用。我建议你按这个顺序记请求先到Servlet容器比如Tomcat然后经过过滤器链再到前端控制器DispatcherServletDispatcherServlet通过HandlerMapping找到能处理这个请求的Handler和执行链HandlerAdapter负责调用真正的Controller方法Controller返回结果后经过参数解析、返回值处理、消息转换最终封装成响应返回给客户端。这里有几个需要展开讲的核心概念。HandlerMapping不是简单找到Controller它还会匹配到拦截器链这一步就是Spring MVC能支持拦截器的原因。HandlerAdapter是把Servlet API和Controller方法解耦的关键比如RequestBody、RequestParam这些参数注解就是它在解析。返回值处理方面ResponseBody会把返回值交给HttpMessageConverter比如Jackson做JSON序列化而不是走视图解析器。面试官隔段时间就会问“RestController和Controller有什么区别”其实一句话就能答清楚RestController是Controller加ResponseBody的组合表示类里所有方法返回的内容都直接写进响应体不走视图解析器。然后是路径匹配问题。Spring 5.3之后默认使用PathPatternParser解析路径和旧版AntPathMatcher相比在处理/api/{id}这种带变量的路径时更高效。如果你能说出“新版Spring默认用PathPatternParser而不是AntPathMatcher”面试官对你的版本敏感度会有不错印象。4.2 过滤器、拦截器、ControllerAdvice别混淆了Web层面试题里出现频率最高的是“Filter和Interceptor的区别”。如果你只答“一个在Servlet之前一个在Spring MVC里”明显不够。至少要从三个角度讲清楚。第一个角度是作用范围。Filter是Servlet规范的一部分能拦截所有URL请求包括静态资源Interceptor是Spring MVC的组件只能拦截进入Controller的请求并且依赖DispatcherServlet。第二个角度是依赖容器。Filter不依赖Spring IoC也能注册但初始化在Servlet容器中Interceptor必须由Spring管理可以依赖Spring容器里的Bean。第三个角度是调用时机。Filter在请求到达DispatcherServlet之前执行Interceptor在HandlerMapping匹配到Handler之后、HandlerAdapter调用Controller前后执行。实际项目里登录校验经常用Filter做粗粒度拦截比如未登录用户重定向控制器级别的权限校验更适合在Interceptor里做细粒度控制因为这时候能拿到Handler方法上的注解。Spring Security这类框架本质上就是一组过滤器链但它的过滤器注册顺序需要精确控制这也是安全框架和普通过滤器容易冲突的原因之一。还有一个高频考点是统一异常处理。ControllerAdvice配合ExceptionHandler可以捕获Controller层抛出的异常还可以结合ResponseEntity返回统一的错误结构。我面试时会问候选人“如果你的Controller抛出NullPointerExceptionControllerAdvice能捕获吗”很多人会愣住。其实只要异常没有被框架提前吞掉ExceptionHandler(Exception.class)就能捕获但要注意异常处理器的匹配规则是找最具体的Handler所以最好同时定义通用异常和自定义业务异常的处理方法。5. Spring Cloud与分布式方向别只会背架构图5.1 注册中心、配置中心、网关的常见追问现在稍微好一点的Java岗位都会问Spring Cloud微服务因为简历上大概率写了。这块不需要你倒背源码但至少要把几个常用组件的原理讲明白否则面试官很容易判断出你只是用过而没有理解。注册中心常见的是Nacos或Eureka。expiry的核心是服务启动时把自己的实例信息注册到注册中心然后定时发送心跳消费者从注册中心拉取服务列表本地缓存一份服务下线时主动注销注册中心发现心跳超时也会把实例剔除。面试官常问“服务列表更新延迟怎么办”你可以答Nacos支持服务端主动通知和客户端定时拉取两种模式所以比纯拉模式的Eureka实时性更好。配置中心的作用是把配置从项目里抽出来集中管理。以Nacos Config为例配置变化后客户端能自动感知并更新结合RefreshScope刷新Bean。如果面试官追问“配置刷新为什么能生效”关键点在于RefreshScope使用了ScopedProxyMode.TARGET_CLASS配置变更时重新生成代理对象触发新的Bean生命周期。网关考点主要集中在路由、过滤器和鉴权。Spring Cloud Gateway基于WebFlux底层是Netty和Zuul那种基于Servlet的实现有本质区别网关过滤器链支持在路由转发前后执行逻辑比如统一加请求头、做接口鉴权、限流。面试时如果能说清楚GlobalFilter和GatewayFilter的区别整体印象分会高很多。GlobalFilter对所有路由生效GatewayFilter只对指定路由生效。注意别在微服务问题上陷得太深。如果面试官明显只考Spring核心你回答微服务时就讲清楚原理和应用场景即可不要主动去讲源码细节否则容易扯出自己还没吃透的内容。5.2 分布式锁和分布式事务面试加分项这部分本来属于更宽的分布式领域但既然简历写了微服务面试官很可能会顺手带出分布式锁、分布式事务。Spring本身没有直接提供分布式锁实现但常放在Spring生态考题里问。分布式锁最常见的技术方案是Redis。核心要点不是setnx一个key就完事而是要保证设置key和过期时间原子执行以及value要带唯一标识防止误删别人的锁。更进阶的是Redisson看门狗机制它能在业务没执行完时自动续期避免锁过期导致并发冲突。面试回答分布式锁时我建议按这个链路讲加锁用SET key value NX EXvalue带上线程标识或UUID解锁时先比较value是否一致相同才删除如果用Redisson看门狗默认会定期续期最后提到锁粒度尽量小不要把大范围业务代码都放在锁里。这样能回答出“分布式锁不是简单setnx”的核心点。分布式事务比分布式锁更复杂。面试中聊起“跨服务调用如何保证数据一致”你可以先按最简单的方式答能不强分两阶段就不用优先考虑本地消息表或事务消息比如RocketMQ的事务消息。面试官如果继续追问再说TCC、Saga这些方案的区别。方案核心思想优点缺点本地消息表本地事务写消息表异步发送MQ实现简单消息表入侵业务库事务消息MQ自带半消息机制无入侵依赖特定MQ组件TCC预留、确认、取消强一致性好需要业务方实现三个接口Saga长事务拆分为本地事务补偿灵活最终一致补偿逻辑复杂面试官问“你们项目里用了哪种分布式事务”这时候千万别只说“用了Seata”。要补一句“业务对一致性要求高还是低系统并发大不大团队能不能扛住多套方案的复杂度”这些才是技术选型时真正需要考虑的东西。6. 常见面试追问与复习避坑记录6.1 面试官最爱挖的坑以及应对思路同样的知识点面试官稍微换个角度问很多人就接不住。我把这几天在面试现场和模拟面试里反复出现的追问场景整理出来这几类问题你复习时一定要特别留意。第一类先说“你讲一下循环依赖”等你讲完后立刻问“既然三级缓存能解决为什么不把所有Bean都扔进第三级缓存提前创建AOP代理”这个问题是在考察你是否理解代理生成的代价。正确的思路是提前创建代理会带来浪费而且代理对象可能因为属性还没填充就生产导致内部状态不对。三级缓存最大的价值就是延迟到真正需要的时候才决定是否生成代理。第二类问完事务失效后追一句“你代码里加Transactional之前会检查什么”。这时候不要只回答“确认方法是不是public”最好补充“先确认调用方走的是不是代理对象”“再确认异常是不是会被吞掉”“还要确认事务管理器是不是已经配置好”。把这三步答出来面试官会认为你是在真实业务里遇到过问题的人。第三类追着自动配置问“你项目里有没有排查过哪些自动配置是多余的”。如果之前项目里用了Redis和MQ但两者其实只在一个小模块里用到自动配置还是会在启动时加载它们。遇到这种情况可以用SpringBootApplication(exclude {RedisAutoConfiguration.class})来排除。能说出这类真实排查过程比背再多的原理都管用。第四类问Spring Boot版本升级踩过什么坑。比如Spring Boot 2.6之后循环依赖默认被禁止、Spring Boot 3.0之后会强制使用Jakarta EE的javax迁移。如果你的项目还停留在老版本恰好说明你对版本差异没有概念。复习时至少要知道2.6和3.x这两个关键时间点的变化。6.2 不同经验段的复习重点按需自查最终能拿到offer的候选人通常不是背得最全的而是复习内容最贴合目标岗位的。我建议你根据当前经验阶段把Spring复习的侧重点做一个取舍不要上来就想啃完所有源码。应届生求职阶段重点抓三层一是IoC容器和Bean生命周期的关键环节尤其是三级缓存循环依赖二是Spring Boot自动配置的工作原理和自定义Starter的基本流程三是Spring事务失效的常见场景和Spring MVC请求链路。这些知识点不深但覆盖面广面试官也能从中看到你的基础扎实程度。注意别急着大谈微服务和分布式事务如果没有真实项目支撑很容易被追问出破绽。一到三年经验的候选人重点要往底层和场景化方向靠Spring AOP的代理机制、事务传播行为在不同业务场景下的选择、Spring Boot启动流程的排查方法、Filter和Interceptor的实践对比再加上Spring Cloud注册中心、配置中心、网关的基础原理。这一阶段面试官更关心你有没有真正做过线上业务而不是只会搭Demo。三到五年经验的候选人除了上面所有内容还需要能讲清楚“为什么这么设计”三级缓存为什么是三级的权衡、Spring Boot自动配置为什么能被用户覆盖、分布式事务方案在不同一致性要求下怎么取舍。这个阶段可以适当聊一聊手写简化版Spring IoC容器或Spring Boot Starter的思路因为那能证明你对框架设计有实际理解而不是停留在使用层。最后提醒一句简历上写“熟悉Spring”面试官就会默认你能应付上面大多数问题如果简历上写“精通Spring”那就要做好被追问AOP源码、Bean生命周期完整代码细节的准备。别把简历定位写得太满给自己留出合理余量也是一种面试技巧。我个人面试人的时候其实最愿意看到的不是你背出了多少细节而是你在卡壳之后能快速定位到相关问题把知道的关联知识串起来。Spring的知识点像一张网Bean生命周期连着循环依赖循环依赖连着AOP代理AOP代理又连着事务失效事务失效又连着事务传播行为。复习时如果能按这条链一路串下来面试官怎么追你都很难被问倒。这套内容整理下来并不轻松但配合前面提到的几个速查表格反复过两三遍效果会比漫无目的地刷面试题好很多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →