Spring面试18问:深度解析与实战指南
2025.09.26 20:49浏览量:4简介:本文总结了Spring面试中常见的18个核心问题,涵盖IoC、AOP、事务管理、性能优化等关键技术点,结合代码示例与场景分析,帮助开发者系统梳理知识体系,提升面试通过率。
一、Spring核心机制
1. Spring IoC容器的工作原理是什么?
IoC(控制反转)通过依赖注入(DI)实现对象生命周期管理。核心流程包括:
- 配置加载:解析XML、注解或Java Config配置
- Bean定义注册:将BeanDefinition存入容器
- 依赖注入:通过构造器、Setter或字段注入完成对象组装
- 初始化回调:执行@PostConstruct、InitializingBean等方法
示例代码:
@Configurationpublic class AppConfig {@Beanpublic UserService userService(UserRepository repository) {return new UserServiceImpl(repository); // 构造器注入}}
2. @Autowired与@Resource的区别?
@Autowired:Spring原生注解,默认按类型注入,可通过@Qualifier指定名称@Resource:JSR-250标准注解,默认按名称注入,无参数时回退到按类型
3. Spring Bean的生命周期有哪些关键阶段?
实例化 → 属性赋值 → BeanPostProcessor前置处理 → 初始化(@PostConstruct/InitializingBean) → BeanPostProcessor后置处理 → 就绪状态 → 销毁(@PreDestroy/DisposableBean)
二、AOP与事务管理
4. 解释Spring AOP的实现原理
基于动态代理:
- JDK动态代理:针对接口实现
- CGLIB代理:通过继承实现类(需注意final方法限制)
关键组件:
AspectJExpressionPointcut:定义切点表达式MethodBeforeAdviceInterceptor:前置通知适配器CglibAopProxy:CGLIB代理生成器
5. @Transactional的传播行为有哪些?
| 行为类型 | 说明 |
|————————|———————————————————————————————————|
| REQUIRED | 默认值,存在事务则加入,否则新建 |
| SUPPORTS | 支持事务,但不强制要求 |
| MANDATORY | 必须在事务中执行,否则抛出异常 |
| REQUIRES_NEW | 总是新建事务,原事务挂起 |
6. 事务失效的常见原因?
- 自调用问题:类内部方法调用导致代理失效
- 异常捕获:未抛出RuntimeException或Error
- 数据库引擎不支持事务(如MyISAM)
- 事务方法被final修饰
三、数据访问与ORM
7. JdbcTemplate与MyBatis的核心差异
| 特性 | JdbcTemplate | MyBatis |
|——————————|———————————————————-|———————————————————|
| SQL管理 | 代码内拼接 | XML/注解配置 |
| 结果映射 | RowMapper接口 | 自动映射/ResultMap |
| 动态SQL | 需手动拼接 | 内置
| 性能优化 | 需手动管理连接 | 一级/二级缓存支持 |
8. @Query注解的参数绑定方式
- 位置参数:
:param+@Param注解 - 索引参数:
?1形式(需保持顺序一致) - SpEL表达式:
#{#entity.name}
示例:
@Query("SELECT u FROM User u WHERE u.name = :name")User findByName(@Param("name") String name);
四、Web与MVC
9. Spring MVC的请求处理流程
DispatcherServlet → HandlerMapping → Controller → ViewResolver → View渲染
关键组件:
RequestMappingHandlerMapping:URL与方法映射HandlerAdapter:统一方法调用接口ModelAndView:数据与视图封装
10. @ResponseBody与@RequestBody的作用
@ResponseBody:将方法返回值序列化为HTTP响应体(需配合HttpMessageConverter)@RequestBody:将HTTP请求体反序列化为Java对象
11. 跨域请求的解决方案
@CrossOrigin注解:@CrossOrigin(origins = "http://example.com")@RestControllerpublic class ApiController {}
- 全局配置:
@Configurationpublic class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*");}}
五、性能与安全
12. Spring Boot启动优化的常见手段
- 排除不必要的自动配置:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) - 延迟初始化:
spring.main.lazy-initialization=true - 减少Bean扫描范围:
@ComponentScan(basePackages = "com.example")
13. 防止XSS攻击的配置
- 使用Spring Security的
HttpFirewall - 配置
XssStringJsonSerializer:@Configurationpublic class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {return builder -> builder.serializerByType(String.class, new XssStringJsonSerializer());}}
六、高级特性
14. Spring Cloud与Spring Boot的关系
- Spring Boot:快速构建独立应用
- Spring Cloud:基于Boot构建分布式系统(服务发现、配置中心、熔断器等)
15. Reactor编程模型的核心概念
- Mono/Flux:异步序列的抽象
- 操作符:
map、flatMap、zip等 - 背压控制:通过
request(n)实现
示例:
Flux.range(1, 5).map(i -> i * 2).subscribe(System.out::println);
七、实战问题
16. 如何解决Bean循环依赖?
- 构造器注入导致的循环依赖无法解决
- Setter/字段注入可通过三级缓存机制解决
- 解决方案:
- 重构设计,引入中间层
- 使用
@Lazy注解延迟加载
17. 测试Spring应用的最佳实践
- 使用
@SpringBootTest进行集成测试 - 模拟依赖:
@MockBean - 测试切片:
@WebMvcTest、@DataJpaTest
18. Spring 6与Spring Boot 3的新特性
- Java 17+ 基线要求
- 移除对Velocity/Thymeleaf 2的支持
- 引入AOT编译支持(Native Image)
- 响应式编程增强(R2DBC集成)
总结建议
- 深入理解核心原理而非死记硬背
- 结合实际项目经验阐述技术选型
- 关注最新版本特性(如Spring 6的AOT)
- 准备2-3个典型问题解决方案的详细说明
本文覆盖了Spring生态从基础到进阶的核心知识点,建议读者结合官方文档与实际项目进行验证,形成自己的知识体系。面试时注意展现问题分析与解决能力,而不仅仅是知识复述。

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