Spring面试18问:从基础到进阶的全面解析
2025.09.26 20:48浏览量:0简介:本文总结了Spring框架面试中常见的18个核心问题,涵盖IoC/AOP原理、事务管理、性能优化等关键知识点,为开发者提供系统性复习指南。
一、Spring核心概念类问题
1. Spring IoC容器的工作原理是什么?
IoC(控制反转)通过依赖注入(DI)实现对象创建与依赖关系的解耦。核心流程包括:
- 容器初始化时扫描配置(XML/注解/Java Config)
- 通过反射实例化Bean并注入依赖属性
- 生命周期回调(如
@PostConstruct)
示例代码:
2. 解释AOP的实现机制及应用场景@Configurationpublic class AppConfig {@Beanpublic UserService userService(UserRepository repo) {return new UserServiceImpl(repo); // 显式依赖注入}}
AOP基于动态代理(JDK/CGLIB),通过切面(Aspect)拦截方法调用。典型场景包括: - 事务管理(
@Transactional) - 日志记录(
@Around切点) - 性能监控
关键术语:切点(Pointcut)、通知(Advice)、织入(Weaving)。
3. Bean的作用域有哪些?如何选择?
- Singleton:默认单例,适合无状态服务
- Prototype:每次请求创建新实例,适用于有状态对象
- Request/Session:Web环境特有,需配合Spring MVC使用
选择依据:资源消耗 vs 线程安全性。
二、数据访问层问题
4. Spring JDBC与JPA/Hibernate的区别
| 特性 | Spring JDBC | JPA/Hibernate |
|———————-|—————————————-|————————————|
| 抽象层级 | 底层API封装 | ORM框架 |
| 开发效率 | 需手动编写SQL | 实体映射自动生成 |
| 性能优化 | 直接控制SQL | 需处理N+1查询问题 |
适用场景:简单查询选JDBC,复杂对象模型选JPA。
5. 声明式事务的传播行为有哪些?
- REQUIRED:默认行为,加入当前事务
- REQUIRES_NEW:新建事务,挂起原事务
- NEVER:非事务环境下执行,否则抛异常
示例配置:@Transactional(propagation = Propagation.REQUIRES_NEW)public void updateOrderStatus() { ... }
6. 如何解决事务失效问题?
常见原因及解决方案:
- 自调用问题:通过AopContext.currentProxy()获取代理对象
- 异常捕获:确保抛出RuntimeException而非Checked Exception
- 数据库引擎:MySQL需使用InnoDB支持事务
三、Web与MVC问题
7. DispatcherServlet的工作流程
九大组件协作流程:
- HandlerMapping定位控制器
- HandlerAdapter执行目标方法
- ViewResolver解析视图
- 渲染模型数据至响应
关键接口:HandlerInterceptor实现预处理/后处理。
8. 如何自定义参数解析器?
实现HandlerMethodArgumentResolver接口,示例:
public class JwtArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(JwtToken.class);}@Overridepublic Object resolveArgument(...) {return extractTokenFromHeader(request);}}
注册至WebMvcConfigurer的addArgumentResolvers()方法。
9. RESTful接口设计的最佳实践
- 资源命名:名词复数形式(/users)
- HTTP方法:GET(查询)、POST(创建)、PUT(更新)、DELETE(删除)
- 状态码规范:200(成功)、201(创建)、400(客户端错误)
- HATEOAS支持:通过
_links提供超媒体控制
四、性能与安全
10. Spring Boot启动优化的方法
- 排除不必要的自动配置:
@SpringBootApplication(exclude = {...}) - 延迟初始化:
spring.main.lazy-initialization=true - 缓存配置:
spring.cache.type=caffeine - 监控端点:启用
/actuator/health
11. 常见安全漏洞及防护
- CSRF:启用
@EnableWebSecurity并配置CsrfFilter - SQL注入:使用
JdbcTemplate参数化查询 - XXE攻击:禁用XML外部实体解析
- 敏感数据:通过
@JsonIgnore排除字段
12. 如何实现接口限流?
方案对比:
- Guava RateLimiter:单机限流
- Redis+Lua:分布式限流
- Spring Cloud Gateway:网关层限流
示例代码(Redis实现):public boolean tryAcquire(String key, int permits, long timeout) {String luaScript = "local current = redis.call('get', KEYS[1]) " +"if current and tonumber(current) >= tonumber(ARGV[1]) then " +" return 0 " +"else " +" redis.call('incrby', KEYS[1], 1) " +" return 1 " +"end";// 执行Lua脚本}
五、进阶与调试
13. 循环依赖的解决机制
三级缓存设计:
- SingletonObjects(成品Bean)
- EarlySingletonObjects(半成品Bean)
- singletonFactories(ObjectFactory缓存)
处理流程:提前暴露ObjectFactory解决构造器循环依赖。
14. 如何调试Bean初始化失败?
排查步骤:
- 检查
@Conditional条件是否满足 - 查看
NoSuchBeanDefinitionException堆栈 - 启用调试日志:
logging.level.org.springframework=DEBUG - 使用
ApplicationContext的containsBean()方法验证
15. Spring Cloud与Spring Boot的区别
| 维度 | Spring Boot | Spring Cloud |
|———————-|——————————————|——————————————|
| 定位 | 快速应用开发框架 | 微服务治理解决方案 |
| 核心组件 | 自动配置、内嵌服务器 | 服务发现、配置中心、网关 |
| 依赖关系 | 可独立使用 | 需基于Spring Boot构建 |
六、实战技巧
16. 动态数据源切换的实现
方案一:AbstractRoutingDataSource
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType();}}
方案二:注解驱动(需结合AOP实现)
17. 测试容器的最佳实践
- 使用
@SpringBootTest进行集成测试 - 模拟依赖:
@MockBean替换真实Bean - 测试事务:
@Transactional自动回滚 - 性能测试:JMeter+Spring Actuator
18. 如何排查内存泄漏?
工具链:
- VisualVM监控堆内存
- MAT分析堆转储文件
- 常见原因:
- 静态集合持续添加元素
- 未关闭的数据库连接
- 线程池未正确销毁
总结
本文系统梳理了Spring面试中的高频考点,从基础原理到实战技巧形成完整知识体系。建议读者结合官方文档与实际项目经验深入理解,重点掌握IoC/AOP核心机制、事务管理细节以及性能优化方法。面试前可通过模拟问答巩固知识点,同时关注Spring 6/Spring Boot 3的新特性(如AOT编译、GraalVM支持)以展现技术前瞻性。

发表评论
登录后可评论,请前往 登录 或 注册