欢迎光临
我们一直在努力

吃透 SSM 直接上岸!2026 大厂高频面试题全集|源码剖析 + 生产坑点 + 实操场景

吃透 SSM 直接上岸!2026 大厂高频面试题全集|源码剖析 + 生产坑点 + 实操场景

题库说明:全网最全SSM全套面试题库,整合Spring、SpringMVC、MyBatis三大核心框架,包含基础概念、底层源码、生产坑点、高频业务场景实操题、SSM整合原理,无冗余无关内容,覆盖校招、社招全阶段面试,可直接全文背诵刷题。

一、Spring框架核心概述

1. 什么是Spring?核心定位与核心特点

Spring是一款轻量级、开源、非侵入式、一站式的Java企业级开发框架,核心目标是简化企业级开发、彻底解耦组件依赖、统一Java Web开发架构,是Java生态的底层核心框架。

四大核心特点:

  • 轻量级:核心框架体积仅2M左右,无重型冗余依赖,启动快、资源占用低;

  • 非侵入式:业务代码无需实现Spring专属接口、无需继承框架类,移除框架后业务代码可独立运行;

  • 一站式:覆盖数据层、业务层、Web层、事务、切面、测试全链路开发场景;

  • 高扩展:框架的框架,可无缝集成MyBatis、Redis、消息队列等所有主流中间件。

2. Spring核心三大核心功能是什么?

Spring整个框架的核心基石为三点,所有功能均基于此拓展:

  • IoC 控制反转:核心解耦思想,容器统一管理对象创建与依赖,彻底解决代码耦合问题;

  • AOP 面向切面编程:无侵入增强方法,统一封装日志、事务、权限、限流等通用横切逻辑;

  • 声明式事务管理:基于AOP实现统一事务管控,简化数据库事务开发,保证数据一致性。

3. Spring完整模块架构及核心模块作用

Spring采用分层模块化架构,各模块职责解耦、按需引入,是Spring全家桶的底层支撑:

模块分类核心模块核心功能
核心容器(底层基石) Core、Bean、Context、SpEL 实现IoC容器、Bean生命周期管理、资源加载、Spring表达式解析
数据访问与集成 JDBC、ORM、Transaction 简化数据库操作、整合持久层框架、统一事务管理
Web开发模块 Web、Web-Servlet 支撑SpringMVC、Web请求处理、HTTP协议适配
AOP切面模块 AOP、Aspects 提供动态代理、切面织入、方法增强能力
测试模块 Test 支持Spring项目单元测试、集成测试、Mock测试

4. 使用Spring的核心优势

  • 彻底解耦:IoC容器接管对象依赖,组件之间低耦合,代码维护性极强;

  • 代码复用:AOP抽取通用逻辑,全局统一管控,消除代码冗余;

  • 简化开发:提供大量工具类、模板类,规避原生Java、JDBC繁琐代码;

  • 易于测试:依赖注入机制支持灵活Mock依赖,单元测试成本极低;

  • 生态强大:无缝兼容所有主流技术栈,适配绝大多数企业级业务场景;

  • 架构规范:强制分层解耦,统一团队开发规范,避免代码混乱。

二、IoC与DI核心原理(高频必考)

5. 什么是IoC控制反转?核心思想

IoC(Inversion of Control,控制反转)是Spring的核心设计思想,颠覆了传统对象创建与管理模式。

传统开发:开发者主动new对象、管理依赖、维护生命周期,控制权在程序员手中;

IoC开发:将对象的创建、赋值、销毁、依赖管理全部交给Spring IoC容器,开发者直接获取对象使用。

核心反转点:对象的控制权从开发者反转到Spring容器,实现组件彻底解耦。

6. 什么是DI依赖注入?三种注入方式详解

DI(Dependency Injection,依赖注入)是IoC的唯一实现手段,容器自动将Bean所需的依赖对象主动注入,无需手动创建依赖。

注入方式优点缺点生产场景
构造器注入(官方推荐) 依赖不可变、必填依赖强制校验、线程安全、无循环依赖隐患、适配单元测试 依赖过多时参数冗长 核心业务Bean、生产首选
Setter注入 支持可选依赖、可动态修改依赖 易出现空指针、依赖状态不固定 非必填、动态变更依赖
字段注入 代码简洁、开发高效 隐藏依赖、不利于测试、易产生循环依赖 简单快速开发场景
官方规范:Spring强制推荐构造器注入,保证Bean初始化依赖完备、线程安全。

7. IoC和DI的关系

IoC是设计思想(目标):实现控制权反转、组件解耦;

DI是实现手段(落地):通过依赖注入完成IoC的全部逻辑;

通俗总结:IoC是指导思想,DI是具体做法,二者一体,无DI则无法实现IoC。

8. BeanFactory和ApplicationContext的区别

BeanFactory是Spring IoC顶层根接口,ApplicationContext是其超强扩展实现,也是项目唯一使用的容器。

对比维度BeanFactoryApplicationContext
加载机制 懒加载,使用Bean时才实例化 即时加载,启动一次性初始化单例Bean
功能范围 仅基础IoC、Bean获取功能 扩展事件、国际化、资源加载、AOP、事务等全套能力
适用场景 极简资源受限环境(几乎不用) 所有企业级Web项目(唯一选型)

三、Spring Bean核心原理(基础+源码)

9. Spring Bean完整生命周期(必背)

完整流程:实例化 → 依赖注入 → Aware回调 → 前置后置处理器 → 初始化 → 就绪使用 → 容器关闭销毁

  • 实例化:通过构造器/工厂方法创建Bean空对象;

  • 依赖注入:完成属性赋值、依赖自动注入;

  • Aware接口回调:Bean感知容器信息(BeanName、BeanFactory、ApplicationContext);

  • BeanPostProcessor前置处理:后置处理器对Bean进行前置增强;

  • 初始化方法执行:@PostConstruct → InitializingBean自定义初始化逻辑;

  • BeanPostProcessor后置处理:完成最终增强(AOP代理在此阶段生成);

  • 就绪使用:Bean完全初始化,存入容器缓存,对外提供服务;

  • 销毁:容器关闭时执行@PreDestroy、DisposableBean销毁方法。

  • 10. Bean五大作用域详解及生产选型

    作用域核心说明生产场景
    singleton(默认) 容器全局唯一实例,启动创建、关闭销毁 99%无状态Bean(Service、Controller、Dao)
    prototype(多例) 每次获取均创建全新实例,容器不管理销毁 有状态、需独立实例的业务Bean
    request 单次HTTP请求一个实例,请求结束销毁 存储请求级临时数据
    session 单个用户会话一个实例,会话过期销毁 存储用户会话、登录状态
    application 整个项目全局唯一实例 全局公共配置、静态资源

    11. Spring Bean默认单例的原因?

    • 性能最优:避免频繁创建销毁对象,减少JVM GC压力与内存开销;

    • 业务适配:绝大多数核心Bean为无状态Bean,无需多实例;

    • 响应更快:启动一次性初始化完成,无需每次请求重复创建;

    • 内存高效:复用JVM内存分配机制,资源利用率更高。

    12. 单例Bean线程安全问题及解决方案

    核心结论:单例Bean不一定线程安全,无可变实例变量则线程安全,存在可变成员变量则线程不安全。

    生产解决方案:

  • 最佳实践:禁止在单例Bean中定义可变实例变量,临时数据存入方法局部变量;

  • 使用ThreadLocal实现线程变量隔离;

  • 修改作用域为prototype多例;

  • 对并发代码块加锁(不推荐,影响性能)。

  • 四、Spring AOP核心原理(必考)

    13. 什么是AOP?核心作用与核心术语

    AOP(面向切面编程)是横向增强的编程思想,基于动态代理,不修改源代码即可对方法进行增强,实现横切逻辑与业务逻辑解耦。

    核心术语含义案例
    切面Aspect 封装横切逻辑的类 日志切面、事务切面、权限切面
    连接点JoinPoint 可被切面拦截的所有点位 所有业务方法执行
    切点Pointcut 通过表达式筛选的目标拦截方法 execution(* com.service..(…))
    通知Advice 切面具体增强逻辑 前置校验、后置日志、异常回滚
    织入Weaving 切面逻辑绑定目标方法的过程 Spring运行时动态织入

    14. AOP五种通知类型及执行顺序

    通知注解执行时机适用场景
    @Before 方法执行前 权限校验、参数校验、请求日志
    @AfterReturning 方法正常返回后 记录成功业务日志、数据统计
    @AfterThrowing 方法抛出异常时 异常告警、事务回滚、错误记录
    @After 方法执行完成(无论异常) 资源释放、连接关闭
    @Around 包裹目标方法,全权控制执行 性能监控、限流、缓存、全链路日志
    标准执行顺序:@Around前置 → @Before → 目标方法 → @After → @AfterReturning/@AfterThrowing → @Around后置

    15. JDK动态代理与CGLIB代理核心区别

    对比维度JDK动态代理CGLIB动态代理
    代理限制 仅支持代理实现接口的类 支持代理普通类、无接口类(继承实现)
    实现原理 Java反射机制 ASM字节码动态生成子类
    性能 反射开销大,性能偏低 直接字节码调用,性能更高
    方法限制 无final方法限制 无法代理final方法
    Spring选择规则 有接口默认使用 无接口自动降级使用

    五、Spring事务管理(高频面试TOP)

    16. 七种事务传播行为详解与生产场景

    传播行为核心规则生产适用场景
    REQUIRED(默认) 有事务加入,无事务新建 90%常规增删改业务
    REQUIRES_NEW 强制新建独立事务,挂起原有事务 独立日志、异步操作、不随主事务回滚业务
    SUPPORTS 有事务加入,无事务非事务执行 纯查询业务
    NOT_SUPPORTED 强制非事务执行,挂起当前事务 耗时统计、无需事务的查询
    MANDATORY 必须在事务内执行,无事务抛异常 核心子业务,依赖主事务
    NEVER 强制非事务,存在事务则抛异常 禁止事务的缓存查询、统计接口
    NESTED 有事务则嵌套(支持保存点),无则新建 子业务可独立回滚场景

    17. 四大事务隔离级别及脏读/不可重复读/幻读解决

    隔离级别脏读不可重复读幻读数据库默认
    READ_UNCOMMITTED 允许 允许 允许 无
    READ_COMMITTED 禁止 允许 允许 Oracle
    REPEATABLE_READ 禁止 禁止 允许 MySQL(默认)
    SERIALIZABLE 禁止 禁止 禁止 极少使用(性能极低)

    18. Spring事务10大失效场景(生产高频坑点)

    Spring事务基于AOP动态代理实现,所有失效场景均为代理失效、规则不匹配导致:

  • 同类方法内部自调用:不走代理,事务完全失效;

  • 异常被try-catch手动捕获:无抛出异常,Spring无法触发回滚;

  • 抛出普通Exception:默认仅回滚RuntimeException,需指定rollbackFor;

  • 方法非public修饰:AOP无法拦截,注解失效;

  • 数据库引擎不支持事务:MyISAM无事务能力,必须使用InnoDB;

  • 传播行为配置错误:配置NOT_SUPPORTED、NEVER等非事务行为;

  • 手动new对象调用方法:非容器Bean,无代理增强;

  • 多线程调用事务方法:子线程独立事务,主线程无法回滚;

  • 开启readOnly只读事务执行写操作:直接报错事务失效;

  • 事务超时:执行超时自动终止,事务失效。

  • 六、Spring循环依赖(源码级高频考点)

    19. 什么是循环依赖?哪些场景可以解决?

    循环依赖指两个或多个Bean互相依赖,形成闭环依赖关系(A依赖B、B依赖A)。

    可解决:字段注入、Setter注入的单例Bean循环依赖;

    不可解决:构造器注入循环依赖、多例Bean循环依赖。

    20. Spring三级缓存源码机制详解

    核心原理:提前暴露半成品Bean引用,解决单例Bean循环依赖问题。

    缓存层级缓存名称存储内容核心作用
    一级缓存 singletonObjects 完全初始化的成品Bean 对外提供可用Bean实例
    二级缓存 earlySingletonObjects 半成品普通Bean实例 提前暴露普通Bean引用,避免重复创建
    三级缓存 singletonFactories Bean工厂ObjectFactory 生成代理Bean引用,解决代理类循环依赖

    21. 为什么构造器注入无法解决循环依赖?

    构造器注入的依赖需要在Bean实例化阶段就必须完全就绪,而三级缓存需要Bean先完成实例化才能存入缓存、暴露引用。构造器循环依赖时双方均无法完成实例化,无法进入缓存流程,因此只能通过代码重构打破依赖闭环。

    七、Spring核心注解高频面试

    22. 组件注解区别(@Component/@Service/@Controller/@Repository)

    四个注解底层功能完全一致,都是将类交给Spring容器管理,仅用于分层语义区分:

    • @Component:通用公共组件、工具类;

    • @Service:业务逻辑层专用;

    • @Controller:Web请求控制层专用;

    • @Repository:数据访问层专用。

    23. @Autowired和@Resource核心区别(必考)

    对比维度@Autowired@Resource
    来源 Spring自定义注解 JSR-250 Java标准注解
    默认注入规则 byType 按类型注入 byName 按名称注入
    依赖匹配规则 优先按类型,多Bean时需配合@Qualifier指定名称 优先按名称,名称匹配失败再按类型
    必填校验 默认必填,可设置required=false非必填 无必填强制校验
    使用场景 项目主流首选,适配Spring全套特性 追求Java标准、解耦框架依赖场景

    24. @Configuration、@Bean注解原理与使用

    @Configuration用于标记配置类,替代传统XML配置文件,配合@Bean实现手动注册Bean到Spring容器。

    核心特性(Full模式 vs Lite模式):

    • 被**@Configuration**修饰:Full模式,内部@Bean方法会被CGLIB代理,调用方法直接从容器取Bean,保证单例;

    • 仅被**@Component**修饰:Lite模式,无代理,多次调用@Bean方法会多次new对象,无法保证单例。

    生产场景:第三方组件注册(RedisTemplate、Mybatis插件、线程池等)、自定义Bean初始化参数。

    25. @Conditional系列注解作用

    Spring条件注解,满足指定条件才注册Bean,是SpringBoot自动配置底层核心原理。

    • @ConditionalOnClass:存在指定类时才加载Bean;

    • @ConditionalOnMissingClass:不存在指定类时加载;

    • @ConditionalOnBean:容器存在指定Bean时加载;

    • @ConditionalOnMissingBean:容器无指定Bean时加载(自定义覆盖默认配置核心);

    • @ConditionalOnProperty:配置文件满足对应参数时生效。

    八、SpringMVC 全套高频面试题(核心+原理+坑点)

    26. 什么是SpringMVC?核心作用

    SpringMVC是Spring生态的Web层MVC框架,基于Servlet实现,用于接收前端HTTP请求、参数解析、业务调度、视图渲染、返回响应,是SSM架构的Web核心,彻底替代原生Servlet繁琐开发。

    核心优势:轻量、注解驱动、请求响应封装完善、无缝整合Spring、适配RESTful风格、参数自动绑定。

    27. SpringMVC完整执行流程(必背流程图解)

    核心九大执行步骤,全程由DispatcherServlet前端控制器统一调度:

  • 请求接收:前端发起HTTP请求,Tomcat拦截,交由DispatcherServlet接收;

  • 处理器映射:DispatcherServlet调用HandlerMapping,根据URL匹配对应的Controller处理器;

  • 获取处理器执行链:封装处理器+拦截器,生成HandlerExecutionChain;

  • 处理器适配器适配:DispatcherServlet调用HandlerAdapter,适配对应Controller执行规则;

  • 拦截器前置处理:执行自定义HandlerInterceptor的preHandle方法;

  • 目标方法执行:适配器反射执行Controller目标方法,完成参数绑定、业务调用;

  • 视图解析:方法返回ModelAndView后,ViewResolver解析视图路径(前后端分离项目直接返回JSON,无视图解析);

  • 拦截器后置处理:执行postHandle方法;

  • 响应返回:渲染视图/返回JSON数据,执行afterCompletion,请求结束。

  • 28. SpringMVC核心组件作用

    核心组件核心职责
    DispatcherServlet(前端控制器) 全局请求统一入口、统一调度所有组件、分发请求、统一响应,核心总指挥
    HandlerMapping(处理器映射器) 根据请求URL、请求方式,匹配对应的Controller处理器方法
    HandlerAdapter(处理器适配器) 适配不同类型的处理器,统一执行规则,反射调用目标方法
    ViewResolver(视图解析器) 解析视图名称,拼接前后缀,定位页面资源(前后端分离基本废弃)
    HandlerInterceptor(拦截器) 请求拦截,实现登录校验、权限控制、日志记录、限流等通用逻辑
    MultipartResolver 文件上传解析器,专门处理multipart/form-data文件上传请求
    ExceptionHandler 全局异常处理器,统一捕获、处理项目所有异常

    29. 拦截器和过滤器的核心区别(高频对比)

    对比维度Filter 过滤器Interceptor 拦截器
    所属层级 Servlet层级,Java Web原生组件 SpringMVC层级,框架自定义组件
    执行时机 请求进入DispatcherServlet之前、响应返回客户端之后 DispatcherServlet分发之后,Controller方法前后
    依赖容器 依赖Tomcat容器,不依赖Spring 依赖Spring容器,可注入Spring Bean
    拦截范围 拦截所有请求(静态资源、动态接口) 仅拦截Controller接口请求,不拦截静态资源
    使用场景 编码过滤、跨域处理、全局请求预处理 登录校验、权限拦截、接口日志、token校验

    30. SpringMVC参数绑定原理与常见问题

    底层核心:HandlerAdapter通过反射+参数解析器,将请求参数自动绑定到方法形参。

    常用参数绑定场景:

    • 普通参数:直接绑定基本数据类型、String,参数名与请求参数名一致;

    • 实体类参数:前端参数名与实体类属性名一致,自动封装对象;

    • @RequestParam:绑定普通参数,解决参数名不一致、必填设置;

    • @PathVariable:绑定URL路径变量,适配RESTful接口;

    • @RequestBody:解析JSON格式请求体,绑定实体类(POST请求专用)。

    常见坑点:GET请求无法使用@RequestBody、POST表单无法使用@RequestBody、参数名不一致导致绑定失败、日期格式不匹配报错。

    31. @ResponseBody、@RestController原理

    • @ResponseBody:将方法返回值自动转为JSON字符串,写入响应体,不跳转页面;

    • @RestController:@Controller + @ResponseBody组合注解,类上所有方法默认返回JSON,适配前后端分离开发;

    • 底层依赖:SpringMVC内置Jackson转换器,实现对象与JSON互转。

    32. SpringMVC乱码解决方案

    核心统一配置:在web.xml中配置CharacterEncodingFilter,强制设置请求、响应编码为UTF-8,解决GET/POST全局乱码问题。

    九、MyBatis 全套核心面试题(基础+源码+坑点)

    33. 什么是MyBatis?核心优势

    MyBatis是一款轻量级、半自动、开源的持久层框架,用于替代原生JDBC,简化数据库CRUD操作,支持自定义SQL、灵活映射,是SSM架构数据层核心框架。

    核心优势:

    • SQL与代码分离,解耦性强、便于维护、方便SQL优化;

    • 底层封装JDBC,无需手动加载驱动、创建连接、关闭资源;

    • 支持动态SQL,灵活适配多条件查询;

    • 自动结果集映射,支持实体类、Map、List封装;

    • 轻量无侵入、性能高、适配所有数据库。

    34. MyBatis和JDBC、Hibernate的区别

    对比对象核心区别选型场景
    MyBatis vs JDBC JDBC原生代码繁琐、资源手动管理;MyBatis封装JDBC,自动管理连接、结果映射、参数预编译,杜绝SQL注入 所有企业级项目优先MyBatis
    MyBatis vs Hibernate MyBatis半自动、手写SQL、灵活度高、易优化;Hibernate全自动ORM、无需写SQL、固化难优化、笨重低效 复杂业务、需SQL优化选MyBatis

    35. MyBatis核心执行流程(必背)

  • 加载配置文件:读取mybatis核心配置文件、Mapper映射文件;

  • 构建SqlSessionFactory:通过SqlSessionFactoryBuilder解析配置,创建会话工厂;

  • 获取SqlSession:工厂开启数据库会话,包含数据库连接、事务环境;

  • 获取Mapper代理对象:动态代理生成Mapper接口实现类;

  • 执行SQL:代理对象调用方法,封装参数、执行预编译SQL;

  • 结果映射:将ResultSet结果集自动映射为Java实体对象;

  • 关闭资源:关闭SqlSession、释放数据库连接。

  • 36. MyBatis核心组件及作用

    • SqlSessionFactoryBuilder:配置解析器,唯一作用是构建SqlSessionFactory,用完即弃;

    • SqlSessionFactory:会话工厂,全局单例,用于创建SqlSession,全局唯一;

    • SqlSession:数据库会话,包含CRUD方法、事务操作,线程不安全,用完关闭;

    • Mapper接口+Mapper.xml:定义数据库操作方法、编写SQL语句;

    • Executor执行器:MyBatis底层SQL执行核心,包含简单、复用、批量执行器。

    37. MyBatis #{} 和 ${} 核心区别(必考)

    对比维度#{} 预编译占位符${} 字符串直接拼接
    编译方式 JDBC预编译PreparedStatement,参数占位 直接字符串拼接SQL,无预编译
    SQL注入 彻底杜绝SQL注入,安全 存在SQL注入风险,不安全
    参数处理 自动添加单引号,适配字符串、数字 直接原样拼接,不会自动加单引号
    使用场景 普通参数查询、新增、修改(99%场景) 动态表名、动态排序字段(极少场景)
    生产规范:优先使用#{},严禁随意使用${},必须使用时做好参数过滤防注入。

    38. MyBatis动态SQL标签大全及场景

    动态SQL解决多条件拼接、空参拼接多余and/or、动态更新字段等问题,是MyBatis核心特性:

    • :条件判断,满足条件拼接SQL,最常用;

    • :自动去除多余前缀and/or,自动拼接where关键字;

    • :更新语句专用,自动去除尾部多余逗号;

    • :遍历集合,用于in查询、批量新增/批量删除;

    • //:多条件分支,类似if-else if-else;

    • :自定义前后缀截取,灵活处理多余字符。

    39. MyBatis一级缓存、二级缓存原理与区别

    缓存作用:减少重复SQL查询,减轻数据库压力,提升接口响应速度。

    缓存类型作用范围生效规则默认状态
    一级缓存 SqlSession级别(单次数据库会话) 同一会话、相同SQL参数,二次查询走缓存;增删改、关闭会话清空缓存 开启
    二级缓存 Mapper命名空间级别(跨会话、全局) 多个SqlSession共享缓存,增删改清空对应Mapper缓存 关闭
    二级缓存开启条件:全局配置开启、Mapper文件配置、实体类实现序列化接口。

    40. MyBatis延迟加载原理与使用场景

    延迟加载(懒加载):针对一对一、一对多关联查询,默认只查询主表数据,使用从表数据时才触发子查询,提升查询性能。

    核心配置:开启lazyLoadingEnabled延迟加载、关闭aggressiveLazyLoading积极加载。

    适用场景:关联数据量大、非必展示的关联字段,避免一次性查询大量冗余数据。

    41. MyBatis常见生产坑点

  • Mapper接口方法名与xml id不一致,导致绑定失败;

  • 实体类属性名与数据库字段名不一致,未配置映射导致查询为null;

  • 动态SQL未使用,出现多余and/or导致SQL报错;

  • 使用${}导致SQL注入漏洞;

  • 一级缓存导致同会话读取旧数据,未实时刷新;

  • 批量操作未使用Batch执行器,频繁交互数据库性能低下;

  • 关联查询未开启懒加载,导致查询数据冗余、接口卡顿。

  • 十、SSM整合核心原理面试题

    42. SSM整合整体架构与职责分工

    SSM = Spring + SpringMVC + MyBatis,分层解耦、各司其职,是传统Java Web企业级标准架构:

    • Spring:全局容器,管理所有Bean、统一事务、AOP增强、依赖注入,统筹全局;

    • SpringMVC:Web层框架,负责接收前端请求、参数解析、接口调度、返回响应;

    • MyBatis:数据层框架,负责数据库CRUD、SQL执行、结果集映射。

    43. SSM整合核心配置流程

  • Spring整合MyBatis:Spring容器管理SqlSessionFactory、MapperScannerConfigurer,自动扫描Mapper接口,将Mapper代理对象注入Service;

  • Spring整合SpringMVC:SpringMVC容器继承Spring父容器,共享Bean,DispatcherServlet接管Web请求;

  • 事务整合:Spring配置事务管理器,开启注解事务,作用于Service层方法;

  • 全局初始化:web.xml配置监听器、前端控制器、编码过滤器,完成项目启动初始化。

  • 44. Spring父子容器机制(SSM核心原理)

    SSM启动存在两个Spring容器:

    • 父容器(Root容器):Spring核心容器,加载Service、Dao、事务、数据源等全局Bean,全局唯一;

    • 子容器(Web容器):SpringMVC容器,仅加载Controller、Web相关组件;

    容器特性:子容器可以访问父容器Bean,父容器无法访问子容器Bean,彻底实现Web层与业务层解耦。

    十一、SSM高频业务场景面试题(生产实操必考)

    45. 场景一:SSM实现用户登录认证功能(完整业务流程)

    业务需求:前端传入用户名密码,后端校验账号密码、记录登录状态、返回登录结果。

    SSM实现流程:

  • Controller层:接收前端用户名、密码参数,调用Service登录方法;

  • Service层:调用Dao根据用户名查询用户信息,判断用户是否存在、密码是否匹配;密码匹配成功后,将用户信息存入Session/Token,返回登录成功;

  • Dao/Mapper层:编写selectByUsername SQL,查询用户数据;

  • 拦截器增强:自定义登录拦截器,拦截所有需要权限的接口,校验Session/Token,未登录直接拦截跳转/返回提示。

  • 坑点解决:密码加密存储(MD5/SHA256)、防止重复登录、参数空校验、异常捕获。

    46. 场景二:SSM实现批量新增/批量修改数据

    业务场景:批量导入用户、批量修改订单状态、批量更新商品信息。

    MyBatis实现方案:使用标签遍历集合,拼接批量SQL。

    生产优化:禁止循环单次insert(频繁交互数据库性能极差),统一使用批量SQL;大数据量拆分批次,避免SQL过长报错;开启MyBatis Batch执行器提升批量性能。

    47. 场景三:SSM事务失效线上问题排查(真实生产)

    场景描述:Service层方法添加@Transactional注解,新增多条数据,中间报错数据未回滚。

    排查思路:

  • 检查方法是否为public(非public无法被AOP拦截);

  • 检查异常是否被try-catch手动捕获,未抛出异常;

  • 检查抛出异常类型,是否为普通Exception(默认只回滚运行时异常);

  • 检查是否同类方法自调用,绕过代理;

  • 检查数据库引擎是否为InnoDB(MyISAM无事务)。

  • 48. 场景四:SSM接口高并发查询卡顿优化方案

    业务问题:数据库数据量大,频繁查询接口响应慢、数据库压力高。

    SSM分层优化方案:

    • Dao层优化:优化SQL、建立索引、避免select *、分页查询、开启MyBatis二级缓存;

    • Service层优化:添加Redis缓存,缓存热点数据,减少数据库查询;

    • Web层优化:拦截器做请求限流、重复请求拦截;

    • 数据库优化:读写分离、分库分表、批量操作替代循环操作。

    49. 场景五:SSM实现文件上传功能

    核心实现:

  • SpringMVC配置MultipartResolver文件上传解析器,设置文件大小、缓存阈值;

  • Controller方法使用MultipartFile接收前端文件;

  • 后端校验文件格式、大小、后缀,防止恶意文件上传;

  • 生成唯一文件名,避免文件覆盖,上传至服务器/OSS;

  • 文件路径存入数据库,完成业务关联。

  • 50. 场景六:SSM全局异常统一处理业务

    业务痛点:代码多处try-catch、异常返回格式不统一、前端难以处理。

    解决方案:基于SpringMVC**@ControllerAdvice + @ExceptionHandler**实现全局异常处理:

    • 拦截项目所有Controller异常,统一封装返回结果;

    • 区分业务异常、系统异常,自定义错误码、错误信息;

    • 统一日志打印,便于线上问题排查;

    • 杜绝前端直接展示服务器原生报错信息,提升安全性。

    十二、SSM面试高频总结(压轴必背)

    51. SSM架构优势与适用场景

    • 分层清晰:Controller/Web、Service业务、Dao数据层,职责单一,易于维护;

    • 解耦性强:Spring IoC+AOP彻底解耦,业务与通用逻辑分离;

    • SQL可控:MyBatis手写SQL,灵活优化,适配复杂业务;

    • 生态成熟:企业使用率极高、文档丰富、坑点明确、适配传统项目迭代。

    52. SSM项目常见线上问题汇总

    • 事务失效导致数据不一致;

    • SQL编写不规范导致慢查询、数据库压力大;

    • 单例Bean可变变量导致线程安全问题;

    • 未做参数校验导致脏数据、非法请求;

    • 缓存使用不当导致数据一致性问题;

    • 请求拦截缺失导致未授权访问。

    赞(0)
    未经允许不得转载:171主机测评 » 吃透 SSM 直接上岸!2026 大厂高频面试题全集|源码剖析 + 生产坑点 + 实操场景
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址