Java大厂面试必看!Spring 核心最常问 20 题(2025最新版,带最简标准答案 + 得分点 + 刨根问底应对)
直接背这20题,阿里P6、字节2-2、美团高级、腾讯T3基本稳过Spring部分!
| 序号 | 问题(面试原题) | 最简标准答案(背会就能说) | 加分点(面试官继续追问时甩) |
|---|---|---|---|
| 1 | Spring IoC 容器启动全过程是怎么样的? | 1. 创建 BeanFactory(DefaultListableBeanFactory) 2. 读取配置(XML/注解)→ BeanDefinition 3. BeanFactoryPostProcessor 4. BeanPostProcessor 注册 5. 实例化所有单例 Bean(finishBeanFactoryInitialization) | refresh() 12步,能背出来直接加10分 |
| 2 | Bean 的完整生命周期 | BeanDefinition → 实例化 → 属性填充 → Aware回调 → BeanPostProcessor前 → @PostConstruct → InitializingBean → init-method → BeanPostProcessor后 → 完成 | 画图最稳!记得标出可以插手的扩展点 |
| 3 | Spring 如何解决循环依赖?三级缓存到底是什么? | 三级缓存: 1. singletonObjects(成品) 2. earlySingletonObjects(早期半成品) 3. singletonFactories(ObjectFactory,解决代理问题) 只解决单例、setter/字段注入的循环依赖 | 追问:为什么需要三级?二级不够吗? 答:为了在AOP时能拿到代理对象,二级会暴露未代理的原始对象,导致最终两个Bean代理状态不一致! |
| 4 | 构造器循环依赖能解决吗? | 不能!因为实例化阶段就卡住了,还没走到放入三级缓存的步骤 | 追问:怎么解决? 答:改用 @Lazy 或 @PostConstruct 延迟注入 |
| 5 | @Autowired 是怎么实现的? | AutowiredAnnotationBeanPostProcessor → InjectionMetadata → findAutowiringMetadata → 解析 @Autowired、@Value → 反射注入 | 追问:@Resource 呢? 答:CommonAnnotationBeanPostProcessor,由JDK提供 |
| 6 | Spring Bean 默认是线程安全的吗? | 不安全!Spring Bean 默认单例,无状态才线程安全,有状态(成员变量)要自己保证 | 追问:怎么保证? 答:1. 无成员变量 2. ThreadLocal 3. 每次 prototype 4. 加锁 |
| 7 | Spring 事务传播行为一共有几种?举例说明 | 7种:REQUIRED(默认)、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED | 重点:REQUIRES_NEW 挂起旧事务开新事务;NESTED 用 Savepoint 嵌套回滚 |
| 8 | @Transactional 什么时候会失效? | 1. 方法不是 public 2. 内部互相调用(代理失效) 3. 抛的不是 RuntimeException 4. try-catch 吃了异常 5. 数据库引擎不支持 6. 未被 Spring 管理 | 能说出6个以上直接过 |
| 9 | 同类中 A 调用 B,B上有 @Transactional,为什么不生效? | 因为没走代理,直接 this.b() 调用,Spring 事务是基于 AOP 代理实现的 | 解决办法:1. @Autowired 自己注入自己 2. 用 @Transactional 在调用方 3. 用 AopContext.currentProxy() |
| 10 | Spring AOP 用的是 JDK 动态代理还是 CGLIB? | 默认:有接口 → JDK 动态代理;无接口或加了 @Configuration → CGLIB(Spring Boot 2.0后默认 CGLIB) | 追问:怎么强制用 CGLIB? 答:spring.aop.proxy-target-class=true |
| 11 | Spring Boot 自动装配原理?@SpringBootApplication 到底干了啥? | 三个注解: @SpringBootConfiguration(就是 @Configuration) @EnableAutoConfiguration(重点) @ComponentScan 核心是 @EnableAutoConfiguration → AutoConfigurationImportSelector → 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3 新机制) | Spring Boot 3 以前是 spring.factories,3以后改成 spring-boot-autoconfigure-metadata.properties + AutoConfiguration.imports 文件 |
| 12 | Spring Boot Starter 机制是怎么实现的? | 1. starter 只做依赖管理 2. 真正的自动配置在 autoconfigure 模块 3. 通过 @Conditional 系列注解控制加载条件 | 追问:手写一个 Starter?能写出来直接起飞! |
| 13 | BeanFactory 和 ApplicationContext 的区别? | BeanFactory 是基础 IoC 容器;ApplicationContext 是子接口,多了事件发布、国际化、资源访问等功能 | 实际项目全用 ApplicationContext |
| 14 | Spring 中用到了哪些设计模式? | 至少9种:单例、工厂、代理、模板方法、观察者、策略、适配器、原型、组合(首选) | 背会:模板方法(JdbcTemplate)、代理(AOP)、策略(@Transactional 的 PlatformTransactionManager) |
| 15 | Spring 事务底层到底是怎么实现的? | AOP → TransactionInterceptor → TransactionManager(DataSourceTransactionManager)→ ThreadLocal 存 Connection → commit/rollback | 核心:ConnectionHolder 存在 ThreadLocal 中 |
| 16 | Spring Boot 3 和 Spring Boot 2 最大的区别? | 1. 基线 Java 17 2. Jakarta EE 9+(javax → jakarta) 3. GraalVM Native 支持 4. 自动配置文件格式改为 AutoConfiguration.imports | 追问:jakarta 包改了哪些? 答:javax.servlet → jakarta.servlet,javax.persistence → jakarta.persistence 等 |
| 17 | @PostConstruct、InitializingBean、init-method 执行顺序? | @PostConstruct → InitializingBean.afterPropertiesSet() → init-method | 记住:@PostConstruct 最先! |
| 18 | BeanFactoryPostProcessor 和 BeanPostProcessor 区别? | 前者改 BeanDefinition(配置阶段),后者改 Bean 实例(实例化后) | 典型:ConfigurationPropertiesBindingPostProcessor、MapperScannerConfigurer(MyBatis) |
| 19 | Spring 如何支持 GraalVM Native Image? | Spring AOT(Ahead-of-Time)插件:在编译期生成初始化代码,替代反射和动态代理 | Spring Boot 3.0+ 官方支持 native-image 编译 |
| 20 | 终极问题:手画三级缓存解决 A→B、B→A 循环依赖的过程 | 画图步骤: 1. 创建A → 实例化 → 放入三级缓存 2. A注入B → 创建B → 实例化 → 放入三级缓存 3. B注入A → 从三级缓存拿到A的ObjectFactory → getObject() → 拿到A(可能已代理) → 注入B 4. B创建完成 → 放入一级缓存 5. A继续属性填充 → 拿到B → 完成 | 能画出来 + 说明为什么三级缓存解决 AOP 问题 → 当场升P7! |
面试终极救命三句话(遇到不会的就甩)
- “底层本质就是 IoC + AOP + 事件机制”
- “Spring 的所有魔法都是通过各种 XxxPostProcessor 和 XxxAware 回调实现的”
- “自动配置的核心是 spring-boot-autoconfigure + @Conditional 系列注解”
把上面20题 + 图背熟,2025年Spring面试基本无敌!
要我给你发带图的PDF版本或每一题的完整源码级解析,直接说一声,我立刻整理!冲!