1. 概述
本文整理了Spring框架相关的核心面试题,帮助开发者快速掌握高频考点。所有内容均基于实际开发经验整理,避免生硬翻译。
2. Spring核心
Q15. 什么是Spring Security?
Spring Security是Spring框架的独立模块,专注于为Java应用提供认证和授权功能。它还能防御常见安全漏洞(如CSRF攻击)。在Web应用中,通过@EnableWebSecurity
注解即可快速启用。
✅ 推荐阅读:Spring安全系列文章
Q16. 什么是Spring Boot?
Spring Boot通过预配置框架集减少样板代码,实现最小化配置启动Spring应用。简单粗暴说:它让开发者专注业务逻辑而非环境配置。
Q17. Spring框架使用了哪些设计模式?
设计模式 | 应用场景 |
---|---|
单例模式 | 单例作用域Bean |
工厂模式 | BeanFactory类 |
原型模式 | 原型作用域Bean |
适配器模式 | Spring Web/MVC |
代理模式 | AOP支持 |
模板方法 | JdbcTemplate等 |
前端控制器 | DispatcherServlet |
数据访问对象 | DAO支持 |
MVC模式 | Spring MVC |
Q18. 原型作用域如何工作?
原型作用域(prototype
)意味着每次请求Bean时,Spring都会创建新实例返回。这与默认单例作用域(整个IoC容器只有一个实例)形成鲜明对比。
3. Spring Web MVC
Q19. 如何在Spring Bean中获取ServletContext和ServletConfig?
两种实现方式:
- 实现Aware接口(完整列表见这里)
- 直接注入: ```java @Autowired ServletContext servletContext;
@Autowired ServletConfig servletConfig;
#### Q20. Spring MVC中的Controller是什么?
所有由`DispatcherServlet`处理的请求都会被转发到带`@Controller`注解的类。每个控制器类将一个或多个请求映射到处理方法,执行业务逻辑。
> ⚠️ 建议先理解[前端控制器模式](https://example.com/spring-controllers)
#### Q21. @RequestMapping注解如何工作?
`@RequestMapping`将Web请求映射到控制器方法,支持:
- HTTP头映射
- URI路径变量(`@PathVariable`)
- 请求参数(`@RequestParam`)
> 🔍 详细用法参考:[RequestMapping详解](https://example.com/spring-requestmapping)
> 📚 更多MVC问题见:[Spring MVC面试题集锦](https://example.com/spring-mvc-interview-questions)
### 4. Spring数据访问
#### Q22. 什么是Spring JdbcTemplate?如何使用?
JdbcTemplate是Spring JDBC的核心API,封装了:
- 连接创建/关闭
- 语句执行和存储过程调用
- ResultSet遍历和结果返回
**配置示例**:
```java
@Configuration
@ComponentScan("org.baeldung.jdbc")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("dev_user");
dataSource.setPassword("dev_password");
return dataSource;
}
}
Q23. 如何在Spring中启用事务?有什么优势?
两种配置方式:
- 注解驱动(推荐)
- AOP配置
核心优势(官方文档):
- 统一JTA/JDBC/Hibernate/JPA等事务API
- 支持声明式事务管理
- 提供比JTA更简单的编程式事务API
- 与Spring数据访问抽象无缝集成
Q24. 什么是Spring DAO?
Spring DAO提供对JDBC/Hibernate/JPA等数据访问技术的一致性支持,简化数据层开发。
📖 深入学习:Spring持久化系列
5. Spring面向切面编程
Q25. 什么是AOP?
AOP通过切面(Aspect)将横切关注点(如事务管理)模块化,在不修改源代码的情况下增强现有功能。
🌰 示例:基于AOP的执行时间日志
Q26. AOP中的核心概念是什么?
术语 | 定义 |
---|---|
切面(Aspect) | 实现横切关注点的类(如事务管理) |
通知(Advice) | 在特定连接点执行的代码 |
切入点(Pointcut) | 匹配连接点的表达式 |
连接点(JoinPoint) | 程序执行中的特定点(如方法执行) |
Q27. 什么是织入(Weaving)?
织入是将切面与其他应用类型/对象链接创建被通知对象的过程。Spring AOP在运行时执行织入(与纯Java AOP框架一致)。
6. Spring 5
Q28. 什么是响应式编程?
响应式编程构建非阻塞、事件驱动的应用,通过少量线程实现高扩展性,核心特性是背压(Back Pressure)防止生产者淹没消费者。
主要优势:
- 提升多核CPU资源利用率
- 减少序列化开销提升性能
❗ 注意:响应式编程≠响应式系统(架构风格),但可用于实现响应式宣言要求的四大特性:
- 响应式(Responsive)
- 容错性(Resilient)
- 弹性(Elastic)
- 消息驱动(Message-driven)
Q29. 什么是Spring WebFlux?
WebFlux是Spring 5的响应式Web框架,作为Spring MVC的替代方案。整个技术栈采用非阻塞设计实现高扩展性。
📚 深入学习:Spring 5 WebFlux教程
Q30. Mono和Flux类型是什么?
WebFlux基于Reactor实现,提供两种核心类型:
- Mono:表示0-1个异步值
public abstract class Mono<T> implements Publisher<T> {...}
- Flux:表示N个异步值流
public abstract class Flux<T> implements Publisher<T> {...}
关键特性:
- 实现Reactive Streams的
Publisher
接口 - 惰性执行(调用
subscribe()
才触发) - 不可变(操作返回新实例)
Q31. WebClient和WebTestClient有什么用?
组件 | 用途 |
---|---|
WebClient | 响应式HTTP客户端,支持非阻塞请求、背压、Java 8 lambda |
WebTestClient | 测试专用客户端,可: • 通过HTTP连接服务器 • 直接绑定WebFlux应用(无需HTTP服务器) |
Q32. 使用响应式流有什么缺点?
⚠️ 主要挑战:
- 调试困难(参考:响应式流调试指南)
- 响应式数据存储支持有限(传统关系数据库尚未完全支持)
- 学习曲线陡峭
Q33. Spring 5兼容旧版Java吗?
❌ 不兼容!Spring 5代码库基于Java 8重构,最低要求JDK 8。
Q34. Spring 5如何集成JDK 9模块化?
Spring 5全面模块化,避免导入无用JAR。示例:
模块定义(HelloWorldModule):
module com.hello {
export com.hello;
}
客户端模块:
module com.hello.client {
requires com.hello;
}
使用示例:
public class HelloWorldClient {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
System.out.println(helloWorld.sayHello()); // 输出: HelloWorld
}
}
Q35. 同一应用能同时使用Web MVC和WebFlux吗?
❌ 不能同时使用!原因:
- Spring Boot根据classpath依赖自动配置,只能二选一
- Spring MVC无法运行在Netty上
- MVC(阻塞式)与WebFlux(非阻塞式)设计理念冲突
7. 结论
本文系统梳理了Spring框架核心面试题,涵盖从基础概念到Spring 5新特性。掌握这些内容将显著提升面试成功率,祝求职顺利!