Spring 面试题
2026/1/15大约 4 分钟
Spring 面试题
IoC 相关
1. 什么是 IoC?什么是 DI?
- IoC(控制反转):将对象的创建和依赖关系的管理交给容器
- DI(依赖注入):IoC 的实现方式,容器将依赖注入到对象中
2. Spring 有哪些依赖注入方式?
- 构造器注入:通过构造函数注入(推荐)
- Setter 注入:通过 setter 方法注入
- 字段注入:通过 @Autowired 直接注入字段
3. @Autowired 和 @Resource 的区别?
| 特性 | @Autowired | @Resource |
|---|---|---|
| 来源 | Spring | JSR-250 |
| 注入方式 | 按类型 | 按名称 |
| 指定名称 | @Qualifier | name 属性 |
4. Bean 的作用域有哪些?
- singleton:单例(默认)
- prototype:原型
- request:每个请求一个
- session:每个会话一个
5. Bean 的生命周期?
- 实例化
- 属性填充
- Aware 接口回调
- BeanPostProcessor 前置处理
- InitializingBean.afterPropertiesSet
- 自定义 init-method
- BeanPostProcessor 后置处理
- 使用
- DisposableBean.destroy
- 自定义 destroy-method
6. Spring 如何解决循环依赖?
通过三级缓存:
- 一级缓存:完整的 Bean
- 二级缓存:早期暴露的 Bean
- 三级缓存:Bean 工厂
注意
构造器注入和 prototype 作用域的循环依赖无法解决。
7. BeanFactory 和 ApplicationContext 的区别?
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| Bean 加载 | 延迟加载 | 预加载 |
| 国际化 | 不支持 | 支持 |
| 事件发布 | 不支持 | 支持 |
AOP 相关
8. 什么是 AOP?
面向切面编程,将横切关注点(日志、事务、权限)从业务逻辑中分离。
9. AOP 的核心概念?
- 切面(Aspect):横切关注点的模块化
- 连接点(Join Point):程序执行的某个点
- 切点(Pointcut):匹配连接点的表达式
- 通知(Advice):在切点执行的动作
10. Spring AOP 和 AspectJ 的区别?
| 特性 | Spring AOP | AspectJ |
|---|---|---|
| 实现方式 | 动态代理 | 字节码织入 |
| 连接点 | 方法级别 | 字段、构造器等 |
| 性能 | 运行时开销 | 编译时织入,性能好 |
11. JDK 动态代理和 CGLIB 的区别?
| 特性 | JDK 动态代理 | CGLIB |
|---|---|---|
| 实现方式 | 基于接口 | 基于继承 |
| 要求 | 目标类实现接口 | 目标类不能是 final |
| 性能 | 创建快,调用慢 | 创建慢,调用快 |
12. 为什么自调用不会触发 AOP?
自调用是直接调用方法,不经过代理对象,所以不会触发 AOP。
解决方案:
- 注入自己
- 使用 AopContext.currentProxy()
事务相关
13. Spring 事务传播行为有哪些?
| 传播行为 | 说明 |
|---|---|
| REQUIRED | 有事务则加入,没有则新建(默认) |
| REQUIRES_NEW | 新建事务,挂起当前事务 |
| NESTED | 嵌套事务 |
| SUPPORTS | 有事务则加入,没有则非事务执行 |
| NOT_SUPPORTED | 非事务执行 |
| MANDATORY | 必须有事务 |
| NEVER | 不能有事务 |
14. @Transactional 失效的场景?
- 方法不是 public
- 自调用
- 异常被捕获
- 抛出检查异常(默认不回滚)
- 数据库不支持事务
- 未被 Spring 管理
- 多线程
15. REQUIRES_NEW 和 NESTED 的区别?
| 特性 | REQUIRES_NEW | NESTED |
|---|---|---|
| 事务关系 | 独立事务 | 嵌套事务 |
| 外层回滚 | 内层不回滚 | 内层回滚 |
| 内层回滚 | 外层不回滚 | 外层可选择 |
Spring Boot 相关
16. Spring Boot 自动配置原理?
- @EnableAutoConfiguration 开启自动配置
- AutoConfigurationImportSelector 加载配置类
- 从 META-INF/spring.factories 读取配置类
- 根据条件注解过滤配置类
- 加载符合条件的配置类
17. Spring Boot Starter 的作用?
Starter 是一组依赖的集合,简化依赖管理。引入一个 Starter 就能获得该功能所需的所有依赖。
18. Spring Boot 配置文件加载顺序?
- 命令行参数
- Java 系统属性
- 操作系统环境变量
- application-{profile}.properties
- application.properties
19. 如何自定义 Starter?
- 创建自动配置类
- 使用条件注解
- 在 META-INF/spring.factories 中注册
20. @SpringBootApplication 包含哪些注解?
- @SpringBootConfiguration:配置类
- @EnableAutoConfiguration:开启自动配置
- @ComponentScan:组件扫描
其他
21. Spring MVC 的执行流程?
- 请求到达 DispatcherServlet
- HandlerMapping 找到 Handler
- HandlerAdapter 执行 Handler
- 返回 ModelAndView
- ViewResolver 解析视图
- 渲染视图返回响应
22. Spring 中用到了哪些设计模式?
- 工厂模式:BeanFactory
- 单例模式:Bean 默认单例
- 代理模式:AOP
- 模板方法:JdbcTemplate
- 观察者模式:事件机制
- 适配器模式:HandlerAdapter
23. Spring 如何处理并发问题?
- Bean 默认单例,无状态设计
- 使用 ThreadLocal 存储线程私有数据
- 使用 prototype 作用域
- 使用同步机制
24. Spring 中的事件机制?
// 定义事件
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
// 发布事件
@Autowired
private ApplicationEventPublisher publisher;
public void publish() {
publisher.publishEvent(new MyEvent(this));
}
// 监听事件
@EventListener
public void handleEvent(MyEvent event) {
System.out.println("收到事件: " + event);
}25. Spring Boot 如何实现热部署?
使用 spring-boot-devtools:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>