Skip to content

Spring 面试题

  Spring 面试题汇总,涵盖 IoC、AOP、事务、Spring MVC、Spring Boot 等核心考点。

一、IoC & DI

Q1:什么是 IoC?

  IoC(控制反转)是把对象创建和管理的控制权从代码中交给 Spring 容器。原来用 new 创建对象,现在由容器创建并注入。DI(依赖注入)是 IoC 的具体实现方式。

Q2:BeanFactory 和 ApplicationContext 的区别?

  BeanFactory 是底层容器,懒加载,功能简单;ApplicationContext 继承 BeanFactory,预加载单例 Bean,额外提供国际化、事件发布、资源加载等功能。日常开发用 ApplicationContext。

Q3:Spring 容器启动流程?

  准备环境 → 创建 BeanFactory → 加载 BeanDefinition → 执行 BeanFactoryPostProcessor → 注册 BeanPostProcessor → 初始化消息源/事件广播器 → 实例化所有单例 Bean → 完成刷新。

Q4:Bean 的生命周期?

  实例化 → 属性填充 → Aware 回调 → BeanPostProcessor.before → @PostConstruct → InitializingBean → init-method → BeanPostProcessor.after → 就绪 → @PreDestroy → DisposableBean → destroy-method。

Q5:构造器注入和字段注入怎么选?

  构造器注入更推荐:依赖不可变(final)、保证不为 null、单元测试友好、尽早暴露循环依赖。字段注入虽然简洁,但依赖隐藏、不利于测试。

Q6:@Autowired 和 @Resource 的区别?

  @Autowired 是 Spring 的,默认按类型注入;@Resource 是 JDK 的,默认按名称注入。Spring 项目用 @Autowired 即可。

Q7:Spring 如何解决循环依赖?

  通过三级缓存:实例化后把工厂放入三级缓存,属性填充时从三级缓存获取依赖的早期引用。构造器注入的循环依赖无法解决。

二、AOP

Q8:什么是 AOP?

  AOP(面向切面编程)把横切关注点(日志、事务、权限)从业务代码中分离。Spring AOP 基于动态代理,JDK 动态代理(有接口)和 CGLIB(无接口)。

Q9:JDK 动态代理和 CGLIB 的区别?

  JDK 动态代理要求目标类实现接口,生成兄弟关系代理;CGLIB 继承目标类,生成子类代理。Spring Boot 默认使用 CGLIB。

Q10:AOP 在什么情况下会失效?

  同类 this 内部调用(绕过代理)、private 方法、final 方法、static 方法。

三、事务

Q11:@Transactional 的原理是什么?

  基于 AOP 动态代理。TransactionInterceptor 在方法执行前开启事务,成功则提交,异常则回滚。通过 ThreadLocal 绑定数据库连接。

Q12:@Transactional 失效的常见原因?

  非 public 方法、同类 this 内部调用、异常被 catch 吞掉、抛出 checked 异常未指定 rollbackFor、数据库引擎不支持事务、final 方法。

Q13:事务的传播机制有哪些?

  REQUIRED(默认,加入已有事务)、REQUIRES_NEW(新建独立事务)、NESTED(嵌套事务)、SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER。

Q14:REQUIRED 和 REQUIRES_NEW 的区别?

  REQUIRED 加入已有事务,一起提交回滚;REQUIRES_NEW 挂起当前事务创建独立事务,互不影响。

四、Spring MVC

Q15:Spring MVC 的请求处理流程?

  请求 → DispatcherServlet → HandlerMapping 找到 Controller → HandlerAdapter 调用 Controller → 返回 ModelAndView → ViewResolver 解析 → 渲染返回。前后端分离中,HttpMessageConverter 将对象转为 JSON。

Q16:过滤器和拦截器的区别?

  过滤器是 Servlet 规范,在 Tomcat 层面执行;拦截器是 Spring 框架的,在 Controller 前后执行,可获取 Controller 方法信息,支持依赖注入。

Q17:@RestController 和 @Controller 的区别?

  @RestController = @Controller + @ResponseBody。@Controller 返回视图,@RestController 返回 JSON。

五、Spring Boot

Q18:Spring Boot 的核心特性?

  自动配置(根据 classpath 自动配置 Bean)、起步依赖(一站式引入兼容依赖)、嵌入式容器(内嵌 Tomcat)、Actuator 监控。

Q19:自动配置的原理?

  @EnableAutoConfiguration → AutoConfigurationImportSelector → 从 .imports 文件加载所有自动配置类 → 条件注解筛选 → 符合条件的自动配置生效。

Q20:@SpringBootApplication 做了什么?

  三个注解的复合:@SpringBootConfiguration(标记配置类)、@EnableAutoConfiguration(开启自动配置)、@ComponentScan(组件扫描)。

Q21:Spring Boot 启动流程?

  创建 SpringApplication → 准备 Environment → 创建 ApplicationContext → 准备 Context → 刷新 Context(自动配置生效)→ 启动嵌入式 Web 服务器 → 发布 ReadyEvent。

Q22:Spring Boot 如何自定义 starter?

  创建自动配置类 + @ConfigurationProperties 绑定配置 + 条件注解控制生效 + .imports 文件注册 + 打包发布。

六、高级特性

Q23:Spring 事件机制的原理?

  基于观察者模式。ApplicationEventPublisher 发布事件,ApplicationEventMulticaster 广播给所有匹配的监听器。默认同步执行。

Q24:@EventListener 和 @TransactionalEventListener 的区别?

  @EventListener 发布时立即执行;@TransactionalEventListener 可指定事务提交后/回滚后执行。发 MQ 消息推荐用 @TransactionalEventListener(AFTER_COMMIT)。

Q25:Spring 中使用了哪些设计模式?

  单例(Bean 作用域)、工厂(BeanFactory)、模板方法(JdbcTemplate)、代理(AOP)、观察者(事件机制)、策略(ResourceLoader)、适配器(HandlerAdapter)。

Q26:什么是 BeanDefinition?

  BeanDefinition 是 Spring 对 Bean 的元数据描述,包含类名、作用域、是否懒加载、依赖关系、初始化方法等。Spring 通过 BeanDefinition 来创建和管理 Bean。

Q27:BeanPostProcessor 有什么用?

  在 Bean 初始化前后插入自定义逻辑。AOP 代理创建、@PostConstruct 处理、@Autowired 处理都是通过 BeanPostProcessor 实现的。

Q28:Spring 和 Spring Boot 的关系?

  Spring Boot 是基于 Spring 的快速开发框架,不是替代关系。Spring 提供 IoC 和 AOP 等核心能力,Spring Boot 提供自动配置、起步依赖、嵌入式容器。

Q29:Spring 6 / Spring Boot 3 有哪些重要变化?

  Java 17 基线、Jakarta EE 替代 Java EE(javax.* → jakarta.*)、AOT(Ahead-of-Time)编译、GraalVM 原生镜像支持、ProblemDetail 错误响应、HttpInterface 声明式 HTTP 客户端。

Q30:说说你对 Spring 的理解?

  Spring 是 Java 生态的核心框架,两大基石是 IoC 容器和 AOP。IoC 通过依赖注入管理对象生命周期和依赖关系,AOP 通过动态代理将横切关注点从业务代码中分离。在此基础上,Spring 提供了数据访问、事务管理、Web 开发、微服务治理等一整套企业级解决方案。Spring Boot 进一步简化了 Spring 的开发配置,通过自动配置和起步依赖让开发者几乎零配置启动项目。