Java面试必看!Spring核心

Java大厂面试必看!Spring 核心最常问 20 题(2025最新版,带最简标准答案 + 得分点 + 刨根问底应对)

直接背这20题,阿里P6、字节2-2、美团高级、腾讯T3基本稳过Spring部分!

序号问题(面试原题)最简标准答案(背会就能说)加分点(面试官继续追问时甩)
1Spring IoC 容器启动全过程是怎么样的?1. 创建 BeanFactory(DefaultListableBeanFactory)
2. 读取配置(XML/注解)→ BeanDefinition
3. BeanFactoryPostProcessor
4. BeanPostProcessor 注册
5. 实例化所有单例 Bean(finishBeanFactoryInitialization)
refresh() 12步,能背出来直接加10分
2Bean 的完整生命周期BeanDefinition → 实例化 → 属性填充 → Aware回调 → BeanPostProcessor前 → @PostConstruct → InitializingBean → init-method → BeanPostProcessor后 → 完成画图最稳!记得标出可以插手的扩展点
3Spring 如何解决循环依赖?三级缓存到底是什么?三级缓存:
1. singletonObjects(成品)
2. earlySingletonObjects(早期半成品)
3. singletonFactories(ObjectFactory,解决代理问题)
只解决单例、setter/字段注入的循环依赖
追问:为什么需要三级?二级不够吗?
答:为了在AOP时能拿到代理对象,二级会暴露未代理的原始对象,导致最终两个Bean代理状态不一致!
4构造器循环依赖能解决吗?不能!因为实例化阶段就卡住了,还没走到放入三级缓存的步骤追问:怎么解决?
答:改用 @Lazy 或 @PostConstruct 延迟注入
5@Autowired 是怎么实现的?AutowiredAnnotationBeanPostProcessor → InjectionMetadata → findAutowiringMetadata → 解析 @Autowired、@Value → 反射注入追问:@Resource 呢?
答:CommonAnnotationBeanPostProcessor,由JDK提供
6Spring Bean 默认是线程安全的吗?不安全!Spring Bean 默认单例,无状态才线程安全,有状态(成员变量)要自己保证追问:怎么保证?
答:1. 无成员变量 2. ThreadLocal 3. 每次 prototype 4. 加锁
7Spring 事务传播行为一共有几种?举例说明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()
10Spring AOP 用的是 JDK 动态代理还是 CGLIB?默认:有接口 → JDK 动态代理;无接口或加了 @Configuration → CGLIB(Spring Boot 2.0后默认 CGLIB)追问:怎么强制用 CGLIB?
答:spring.aop.proxy-target-class=true
11Spring 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 文件
12Spring Boot Starter 机制是怎么实现的?1. starter 只做依赖管理
2. 真正的自动配置在 autoconfigure 模块
3. 通过 @Conditional 系列注解控制加载条件
追问:手写一个 Starter?能写出来直接起飞!
13BeanFactory 和 ApplicationContext 的区别?BeanFactory 是基础 IoC 容器;ApplicationContext 是子接口,多了事件发布、国际化、资源访问等功能实际项目全用 ApplicationContext
14Spring 中用到了哪些设计模式?至少9种:单例、工厂、代理、模板方法、观察者、策略、适配器、原型、组合(首选)背会:模板方法(JdbcTemplate)、代理(AOP)、策略(@Transactional 的 PlatformTransactionManager)
15Spring 事务底层到底是怎么实现的?AOP → TransactionInterceptor → TransactionManager(DataSourceTransactionManager)→ ThreadLocal 存 Connection → commit/rollback核心:ConnectionHolder 存在 ThreadLocal 中
16Spring 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 最先!
18BeanFactoryPostProcessor 和 BeanPostProcessor 区别?前者改 BeanDefinition(配置阶段),后者改 Bean 实例(实例化后)典型:ConfigurationPropertiesBindingPostProcessor、MapperScannerConfigurer(MyBatis)
19Spring 如何支持 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!

面试终极救命三句话(遇到不会的就甩)

  1. “底层本质就是 IoC + AOP + 事件机制”
  2. “Spring 的所有魔法都是通过各种 XxxPostProcessor 和 XxxAware 回调实现的”
  3. “自动配置的核心是 spring-boot-autoconfigure + @Conditional 系列注解”

把上面20题 + 图背熟,2025年Spring面试基本无敌!
要我给你发带图的PDF版本或每一题的完整源码级解析,直接说一声,我立刻整理!冲!

文章已创建 3958

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部