SSM框架面试高频题:Spring IOC/AOP、SpringMVC流程、MyBatis原理与缓存

📅 2026/7/13 16:50:35
SSM框架面试高频题:Spring IOC/AOP、SpringMVC流程、MyBatis原理与缓存
前言八股按照重要程度来进行复习时间充裕可全部看一下不充裕的话就看重点部分第一优先级redis、mysql一定要背第二优先级JVM虚拟机、SSM框架一定要背第三优先级常见集合、计算机网络大部分要背第四优先级Java基础、数据结构、操作系统时间不充裕可不背可以实习的时候复习1.Spring框架中的单例bean是线程安全的吗候选人不是线程安全的。当多用户同时请求一个服务时容器会给每个请求分配一个线程这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改比如修改单例的成员属性比如某个Controller里面用了一个int count 成员变量就需要考虑线程安全性就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装线程安全和并发问题需要开发者自行处理。通常在项目中使用的Spring bean是不可变状态即一般不进行修改的Bean如注入的service只是调用业务方法而不会去修改它的属性和方法因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态如ViewModel对象就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。2.什么是AOP候选人AOP即面向切面编程在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来实现公共模块复用降低耦合。常见的应用场景包括公共日志保存和事务处理。3.项目中有没有使用到AOP候选人我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式找到需要记录日志的方法然后通过环绕通知的参数获取请求方法的参数例如类信息、方法信息、注解、请求方式等并将这些参数保存到数据库。4.Spring中的事务是如何是实现的候选人Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截在执行方法前开启事务在执行完目标方法后根据执行情况提交或回滚事务。5.Spring中事务失效的场景有哪些候选人在项目中我遇到过几种导致事务失效的场景如果方法内部捕获并处理了异常没有将异常抛出会导致事务失效。因此处理异常后应该确保异常能够被抛出。如果方法抛出检查型异常checked exception并且没有在Transactional注解上配置rollbackFor属性为Exception那么异常发生时事务可能不会回滚。如果事务注解的方法不是公开public修饰的也可能导致事务失效。6.Spring的bean生命周期候选人Spring中bean的生命周期包括以下步骤通过BeanDefinition获取bean的定义信息。调用构造函数实例化bean。进行bean的依赖注入例如通过setter方法或Autowired注解。处理实现了Aware接口的bean。执行BeanPostProcessor的前置处理器。调用初始化方法如实现了InitializingBean接口或自定义的init-method。执行BeanPostProcessor的后置处理器可能在这里产生代理对象。最后是销毁bean。7.Spring中的循环引用候选人循环依赖发生在两个或两个以上的bean互相持有对方形成闭环。Spring框架允许循环依赖存在并通过三级缓存解决大部分循环依赖问题一级缓存单例池缓存已完成初始化的bean对象。二级缓存缓存尚未完成生命周期的早期bean对象。三级缓存缓存ObjectFactory用于创建bean对象。8.循环引用的具体解决流程能说一下吗候选人解决循环依赖的流程如下实例化A对象并创建ObjectFactory存入三级缓存。A在初始化时需要B对象开始B的创建逻辑。B实例化完成也创建ObjectFactory存入三级缓存。B需要注入A通过三级缓存获取ObjectFactory生成A对象存入二级缓存。B通过二级缓存获得A对象后B创建成功存入一级缓存。A对象初始化时由于B已创建完成可以直接注入BA创建成功存入一级缓存。清除二级缓存中的临时对象A。9.构造方法出现了循环依赖怎么解决候选人由于构造函数是bean生命周期中最先执行的Spring框架无法解决构造方法的循环依赖问题。可以使用Lazy懒加载注解延迟bean的创建直到实际需要时。10.SpringMVC的执行流程能说明一下吗候选人SpringMVC的执行流程包括以下步骤用户发送请求到前端控制器DispatcherServlet。DispatcherServlet调用HandlerMapping找到具体处理器。HandlerMapping返回处理器对象及拦截器如果有给DispatcherServlet。DispatcherServlet调用HandlerAdapter。HandlerAdapter适配并调用具体处理器Controller。Controller执行并返回ModelAndView对象。HandlerAdapter将ModelAndView返回给DispatcherServlet。DispatcherServlet传给ViewResolver进行视图解析。ViewResolver返回具体视图给DispatcherServlet。DispatcherServlet渲染视图并响应用户。步骤序号核心动作核心组件 / 对象大白话解释核心作用1用户发送请求到 DispatcherServlet前端控制器 DispatcherServlet用户的所有 HTTP 请求如 GET/POST都先交给这个 “中央调度器”它是 SpringMVC 的唯一入口相当于项目的 “前台接待”不处理业务只负责协调其他组件2DispatcherServlet 调用 HandlerMapping处理器映射器 HandlerMapping接待员DispatcherServlet问 “映射器”这个请求比如/user/list该找哪个 Controller 的哪个方法处理底层是匹配 RequestMapping 注解的 URL 映射3HandlerMapping 返回处理器 拦截器HandlerMapping 拦截器映射器返回目标 Controller 对象及具体方法同时返回配置的拦截器比如登录校验、日志拦截器4DispatcherServlet 调用 HandlerAdapter处理器适配器 HandlerAdapter接待员拿到 Controller 后交给 “适配器”—— 因为 Controller 写法不同注解式、实现接口式适配器统一调用方式避免接待员直接对接不同类型的 Controller5HandlerAdapter 调用具体 Controller处理器 Controller适配器按统一规则调用 Controller 的业务方法执行核心逻辑比如查数据库、处理请求参数、调用服务层6Controller 返回 ModelAndViewController ModelAndViewController 处理完业务返回 “数据Model 视图名View”Model 是业务数据如用户列表View 是逻辑视图名如user/list7HandlerAdapter 返回 ModelAndView 给 DispatcherServletHandlerAdapter ModelAndView适配器把处理结果回传给接待员8DispatcherServlet 传给 ViewResolver视图解析器 ViewResolver接待员问 “解析器”逻辑视图名user/list对应哪个物理视图文件9ViewResolver 返回具体视图ViewResolver解析器根据配置前缀 后缀返回物理路径比如/WEB-INF/views/user/list.jsp10DispatcherServlet 渲染视图并响应DispatcherServlet 视图接待员把 Model 中的数据填充到视图中比如 JSP 渲染用户列表生成 HTML 响应给用户11.Springboot自动配置原理能说明一下吗候选人Spring Boot的自动配置原理基于SpringBootApplication注解它封装了SpringBootConfiguration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration是核心它通过Import导入配置选择器读取META-INF/spring.factories文件中的类名根据条件注解决定是否将配置类中的Bean导入到Spring容器中。12.Spring的常见注解候选人Spring的常见注解包括声明Bean的注解Component、Service、Repository、Controller。依赖注入相关注解Autowired、Qualifier、Resource。设置作用域的注解Scope。配置相关注解Configuration、ComponentScan、Bean。AOP相关注解Aspect、Before、After、Around、Pointcut。13.SpringMVC常见的注解有哪些候选人SpringMVC的常见注解有RequestMapping映射请求路径。RequestBody接收HTTP请求的JSON数据。RequestParam指定请求参数名称。PathVariable从请求路径中获取参数。ResponseBody将Controller方法返回的对象转化为JSON。RequestHeader获取请求头数据。PostMapping、GetMapping等。注SpringMVC大白话理解为帮我搞定 “用户浏览器发请求→后端处理请求→返回响应” 的 “一站式工具包”—— 不用自己写复杂的 Servlet、处理请求参数、适配不同的返回格式JSP/JSONSpringMVC 已经封装好了所有核心逻辑只需要关注 “业务逻辑比如查用户、改订单” 即可。14.Springboot常见的注解有哪些候选人Spring Boot的常见注解包括SpringBootApplication由SpringBootConfiguration、EnableAutoConfiguration和ComponentScan组成。其他注解如RestController、GetMapping、PostMapping等用于简化Spring MVC的配置。15.MyBatis的执行流程说一下候选人MyBatis的执行流程如下读取MyBatis配置文件mybatis-config.xml。构造会话工厂SqlSessionFactory。会话工厂创建SqlSession对象。操作数据库的接口Executor执行器。Executor执行方法中的MappedStatement参数。输入参数映射。输出结果映射。16.MyBatis是否支持延迟加载候选人MyBatis支持延迟加载即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。注MyBatis 的延迟加载是指在查询带有关联关系的数据时比如用户和订单、订单和商品不会在查询主数据的同时立即加载关联数据而是等到你「真正需要使用」这些关联数据时才会触发数据库查询。17.延迟加载的底层原理知道吗候选人延迟加载的底层原理主要使用CGLIB动态代理实现使用CGLIB创建目标对象的代理对象。调用目标方法时如果发现是null值则执行SQL查询。获取数据后设置属性值并继续查询目标方法。18.Mybatis的一级、二级缓存用过吗候选人MyBatis的一级缓存是基于PerpetualCache的HashMap本地缓存作用域为Session默认开启。二级缓存需要单独开启作用域为Namespace或mapper默认也是采用PerpetualCacheHashMap存储。注MyBatis 的缓存是为了减少数据库查询次数将查询结果临时存储在内存中后续相同查询请求直接从缓存取数据无需访问数据库核心分为两级一级缓存SqlSession会话级别的本地缓存默认开启仅当前 SqlSession 可用可以把 SqlSession 理解为 “一次数据库会话”一级缓存就是这个会话的 “临时记事本”你查过一次 “id1 的用户”记事本就记下来下次再问直接念记事本内容不用再去问数据库。二级缓存Mapper命名空间级别的全局缓存需手动开启跨 SqlSession 共享。二级缓存是Mapper命名空间 namespace级别的全局缓存相当于多个 SqlSession 共享的 “公共记事本”19.Mybatis的二级缓存什么时候会清理缓存中的数据候选人当作用域一级缓存Session/二级缓存Namespaces进行了新增、修改、删除操作后默认该作用域下所有select中的缓存将被清空。