一、Spring 面试题(核心重点)
1. 什么是 Spring?
Spring 是一个轻量级开源框架,核心功能:
-
IOC(控制反转)
-
AOP(面向切面编程)
👉 本质:
Spring = 容器 + 解耦 + 管理对象生命周期
2. 什么是 IOC?
IOC(Inversion of Control):
👉 把对象创建的控制权交给 Spring 容器
传统方式
java
UserService service = new UserService();
Spring方式
java
@Autowired
UserService service;
👉 对象由 Spring 创建和注入
3. IOC 的实现原理
核心:
-
反射
-
工厂模式
-
XML / 注解配置
4. 什么是 DI?
DI(依赖注入)是 IOC 的实现方式:
-
构造器注入
-
setter 注入
-
注解注入(常用)
5. Bean 的生命周期(高频)
-
实例化
-
属性赋值
-
初始化
-
使用
-
销毁
👉 扩展:
-
BeanPostProcessor
-
初始化方法(init)
-
销毁方法(destroy)
6. Bean 的作用域
-
singleton(默认)
-
prototype
-
request
-
session
7. Spring AOP 是什么?
AOP(面向切面编程):
👉 在不修改原代码的情况下增强功能
应用场景
-
日志
-
事务
-
权限校验
8. AOP 底层原理
-
JDK 动态代理(接口)
-
CGLIB(子类继承)
9. Spring 事务原理(必问)
核心:
-
AOP + 动态代理
-
事务管理器(TransactionManager)
传播行为(重点)
-
REQUIRED(默认)
-
REQUIRES_NEW
-
SUPPORTS
常见问题
👉 为什么事务失效?
-
方法不是 public
-
自调用(this.xxx)
-
异常被捕获
-
没有被 Spring 管理
二、SpringMVC 面试题
1. 什么是 SpringMVC?
SpringMVC 是基于 MVC 模式的 Web 框架。
2. 执行流程(必背)
-
用户发送请求
-
DispatcherServlet 接收请求
-
HandlerMapping 查找处理器
-
HandlerAdapter 调用 Controller
-
返回 ModelAndView
-
视图解析器渲染页面
3. 核心组件
-
DispatcherServlet(核心)
-
HandlerMapping
-
HandlerAdapter
-
ViewResolver
4. @RequestMapping 作用
用于:
👉 映射 URL 到方法
5. 参数绑定方式
-
@RequestParam
-
@PathVariable
-
@RequestBody
6. @ResponseBody 作用
👉 将返回值转为 JSON
7. SpringMVC 和 SpringBoot 区别
| 对比 | SpringMVC | SpringBoot |
|---|---|---|
| 配置 | 繁琐 | 自动配置 |
| 启动 | 需要容器 | 内嵌 Tomcat |
| 目的 | MVC 框架 | 快速开发 |
三、MyBatis 面试题
1. 什么是 MyBatis?
MyBatis 是一个半自动 ORM 框架。
👉 特点:
-
SQL 自己写
-
支持动态 SQL
2. MyBatis 执行流程(重点)
-
加载配置文件
-
创建 SqlSessionFactory
-
获取 SqlSession
-
执行 SQL
-
返回结果
3. #{} 和 ${} 区别(必问)
| 写法 | 作用 | 安全性 |
|---|---|---|
| #{} | 预编译 | 安全 |
| ${} | 字符串拼接 | 不安全 |
👉 ${} 会导致 SQL 注入
4. 一级缓存和二级缓存
一级缓存
- SqlSession 级别(默认开启)
二级缓存
- Mapper 级别(需开启)
5. 延迟加载
👉 按需加载数据(懒加载)
6. MyBatis 优缺点
优点:
-
灵活
-
SQL 可控
缺点:
-
SQL 分散
-
开发量大
四、MyBatis-Plus 面试题
1. 什么是 MyBatis-Plus?
MyBatis-Plus 是 MyBatis 的增强工具。
👉 特点:
-
少写 SQL
-
自动 CRUD
2. 核心功能
-
BaseMapper
-
条件构造器 Wrapper
-
分页插件
-
逻辑删除
3. 常用方法
java
userMapper.selectById(1);
userMapper.insert(user);
4. Wrapper 条件构造器
java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "Tom");
5. 分页实现
java
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);
6. 逻辑删除
👉 本质:
用字段标记删除,而不是真删
7. 自动填充
java
@TableField(fill = FieldFill.INSERT)
五、框架对比总结(面试必答)
1. Spring vs SpringMVC
-
Spring:容器 + AOP
-
SpringMVC:Web 层框架
2. MyBatis vs MyBatis-Plus
| 对比 | MyBatis | MyBatis-Plus |
|---|---|---|
| SQL | 手写 | 自动生成 |
| 开发效率 | 低 | 高 |
| 灵活性 | 高 | 稍低 |
六、面试高频连环问(重点)
1. Spring 如何解决循环依赖?
👉 三级缓存:
-
一级缓存:单例池
-
二级缓存:早期对象
-
三级缓存:对象工厂
2. Bean 是线程安全的吗?
👉 默认不是(singleton)
3. MyBatis 为什么比 Hibernate 快?
👉 因为:
-
SQL 可控
-
无复杂映射
4. MyBatis-Plus 会不会影响性能?
👉 不会,本质还是 MyBatis
七、实战经验(加分项)
1. 项目中如何用?
👉 示例:
-
Spring:管理 Bean + 事务
-
SpringMVC:接口开发
-
MyBatis:SQL 执行
-
MyBatis-Plus:快速 CRUD
2. 常见问题
-
事务失效
-
SQL 注入
-
分页不生效
-
逻辑删除异常
八、一句话总结
👉 整体架构:
Spring 管理对象
SpringMVC 处理请求
MyBatis 操作数据库
MyBatis-Plus 提升开发效率