logo

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等方法

示例代码:

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public UserService userService(UserRepository repository) {
  5. return new UserServiceImpl(repository); // 构造器注入
  6. }
  7. }

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}

示例:

  1. @Query("SELECT u FROM User u WHERE u.name = :name")
  2. 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. 跨域请求的解决方案

五、性能与安全

12. Spring Boot启动优化的常见手段

  • 排除不必要的自动配置:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
  • 延迟初始化:spring.main.lazy-initialization=true
  • 减少Bean扫描范围:@ComponentScan(basePackages = "com.example")

13. 防止XSS攻击的配置

  • 使用Spring Security的HttpFirewall
  • 配置XssStringJsonSerializer
    1. @Configuration
    2. public class JacksonConfig {
    3. @Bean
    4. public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    5. return builder -> builder.serializerByType(String.class, new XssStringJsonSerializer());
    6. }
    7. }

六、高级特性

14. Spring Cloud与Spring Boot的关系

  • Spring Boot:快速构建独立应用
  • Spring Cloud:基于Boot构建分布式系统(服务发现、配置中心、熔断器等)

15. Reactor编程模型的核心概念

  • Mono/Flux:异步序列的抽象
  • 操作符:mapflatMapzip
  • 背压控制:通过request(n)实现

示例:

  1. Flux.range(1, 5)
  2. .map(i -> i * 2)
  3. .subscribe(System.out::println);

七、实战问题

16. 如何解决Bean循环依赖?

  • 构造器注入导致的循环依赖无法解决
  • Setter/字段注入可通过三级缓存机制解决
  • 解决方案:
    • 重构设计,引入中间层
    • 使用@Lazy注解延迟加载

17. 测试Spring应用的最佳实践

18. Spring 6与Spring Boot 3的新特性

  • Java 17+ 基线要求
  • 移除对Velocity/Thymeleaf 2的支持
  • 引入AOT编译支持(Native Image)
  • 响应式编程增强(R2DBC集成)

总结建议

  1. 深入理解核心原理而非死记硬背
  2. 结合实际项目经验阐述技术选型
  3. 关注最新版本特性(如Spring 6的AOT)
  4. 准备2-3个典型问题解决方案的详细说明

本文覆盖了Spring生态从基础到进阶的核心知识点,建议读者结合官方文档与实际项目进行验证,形成自己的知识体系。面试时注意展现问题分析与解决能力,而不仅仅是知识复述。

相关文章推荐

发表评论

活动