news 2026/10/22 18:26:23

Spring含大厂高频面试题(详细+图片讲解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring含大厂高频面试题(详细+图片讲解)

1、Spring框架中的单例bean是线程安全的吗?

候选人:

不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装,线程安全和并发问题需要开发者自行处理。

通常在项目中使用的Spring bean是不可变状态(如Service类和DAO类),因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态(如ViewModel对象),就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。

import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @Service @Scope("prototype") // 指定多例作用域 public class UserService { }

2、什么是AOP?

候选人:

AOP,即面向切面编程,在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。

3、你们项目中有没有使用到AOP?

我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库。

4、Spring中的事务是如何实现的?

候选人:

Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截,在执行方法前开启事务,在执行完目标方法后根据执行情况提交或回滚事务。

5、Spring中事务失效的场景有哪些?

在项目中,我遇到过几种导致事务失效的场景:

如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。

如果方法抛出检查型异常(checked exception),并且没有在@Transactional注解上配置rollbackFor属性为Exception,那么异常发生时事务可能不会回滚。

如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。

Spring 事务是AOP 动态代理实现的,而Spring AOP(JDK 代理 / CGLIB 代理)只能拦截 public 方法

6、Spring的bean的生命周期?

候选人:

Spring中bean的生命周期包括以下步骤:

  1. 通过BeanDefinition获取bean的定义信息。加载 xml / 注解配置,解析得到BeanDefinition(Bean 元信息:类名、属性、scope 等)

  2. 调用构造函数实例化bean。根据 BeanDefinition,通过反射调用构造方法,new 出 Bean 原始对象

此时对象已经存在,但属性还没赋值。

  1. 进行bean的依赖注入,例如通过setter方法或@Autowired注解。给对象属性赋值。

此时 Bean 对象有属性了,但还没有初始化。

  1. 处理实现了Aware接口的bean。执行aware里面重写的方法

  2. 执行BeanPostProcessor的前置处理器。

  3. 调用初始化方法,如实现了InitializingBean接口或自定义的init-method。

  4. 执行BeanPostProcessor的后置处理器,可能在这里产生代理对象。(AOP 代理通常就是在这里生成的。

之后 Bean 就可以正常使用了,单例 Bean 会放入单例池。)最后是销毁bean。

7、Spring中的循环引用?

候选人:

循环依赖发生在两个或两个以上的bean互相持有对方,形成闭环。Spring框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题:

  1. 一级缓存:单例池,缓存已完成初始化的bean对象。

  2. 二级缓存:缓存尚未完成生命周期的早期bean对象。

  3. 三级缓存:缓存ObjectFactory,用于创建bean对象和bean的代理对象。

只用二级缓存,在普通无 AOP 场景下可以解决循环依赖;但是一旦 bean 需要 AOP 代理,二级缓存就会出现问题。所以 Spring 引入第三级缓存,专门处理【需要 AOP 代理】的循环依赖场景。

那具体解决流程清楚吗?

候选人:

解决循环依赖的流程如下:

  1. 实例化A对象,并创建ObjectFactory存入三级缓存。

  2. A在初始化时需要B对象,开始B的创建逻辑。

  3. B实例化完成,也创建ObjectFactory存入三级缓存。

  4. B需要注入A,通过三级缓存获取ObjectFactory生成A对象,存入二级缓存。

  5. B通过二级缓存获得A对象后,B创建成功,存入一级缓存。

  6. A对象初始化时,由于B已创建完成,可以直接注入B,A创建成功存入一级缓存。

  7. 清除二级缓存中的临时对象A。

8、构造方法出现了循环依赖怎么解决?

候选人:

由于构造函数是bean生命周期中最先执行的,Spring框架无法解决构造方法的循环依赖问题。可以使用@Lazy懒加载注解,延迟bean的创建直到实际需要时。

9、SpringMVC的执行流程?

候选人:

SpringMVC的执行流程包括以下步骤:

  1. 用户发送请求到前端控制器DispatcherServlet。

  2. DispatcherServlet调用HandlerMapping找到具体处理器。

  3. HandlerMapping返回处理器对象及拦截器(如果有)给DispatcherServlet。

  4. DispatcherServlet调用HandlerAdapter。

  5. HandlerAdapter适配并调用具体处理器(Controller)。

  6. Controller执行并返回ModelAndView对象。

  7. HandlerAdapter将ModelAndView返回给DispatcherServlet。

  8. DispatcherServlet传给ViewResolver进行视图解析。

  9. ViewResolver返回具体视图给DispatcherServlet。

  10. DispatcherServlet渲染视图并响应用户。

10、Springboot自动配置原理?

候选人:

Spring Boot的自动配置原理基于@SpringBootApplication注解,它封装了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。@EnableAutoConfiguration是核心,它通过@Import导入配置选择器,读取META-INF/spring.factories文件中的类名,根据条件注解决定是否将配置类中的Bean导入到Spring容器中。

11、Spring 的常见注解有哪些?

候选人:

Spring的常见注解包括:

  1. 声明Bean的注解:@Component、@Service、@Repository、@Controller。

  2. 依赖注入相关注解:@Autowired、@Qualifier、@Resource。

  3. 设置作用域的注解:@Scope。

  4. 配置相关注解:@Configuration、@ComponentScan、@Bean。

  5. AOP相关注解:@Aspect、@Before、@After、@Around、@Pointcut。

12、SpringMVC常见的注解有哪些?

候选人:

SpringMVC的常见注解有:

  • @RequestMapping:映射请求路径。

  • @RequestBody:接收HTTP请求的JSON数据。

  • @RequestParam:指定请求参数名称。

  • @PathVariable:从请求路径中获取参数。

  • @ResponseBody:将Controller方法返回的对象转化为JSON。

  • @RequestHeader:获取请求头数据。

  • @PostMapping、@GetMapping等。

13、Springboot常见注解有哪些?

候选人:

Spring Boot的常见注解包括:

  • @SpringBootApplication:由@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan组成。

  • 其他注解如@RestController、@GetMapping、@PostMapping等,用于简化Spring MVC的配置。

14、MyBatis执行流程?

候选人:

MyBatis的执行流程如下:

  1. 读取MyBatis配置文件mybatis-config.xml。

  2. 构造会话工厂SqlSessionFactory。

  3. 会话工厂创建SqlSession对象。

  4. 操作数据库的接口,Executor执行器。

  5. Executor执行方法中的MappedStatement参数。

  6. 输入参数映射。

  7. 输出结果映射。

15、Mybatis是否支持延迟加载?

候选人:

MyBatis支持延迟加载,即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。

16、延迟加载的底层原理知道吗?

候选人:

延迟加载的底层原理主要使用CGLIB动态代理实现:

  1. 使用CGLIB创建目标对象的代理对象。

  2. 调用目标方法时,如果发现是null值,则执行SQL查询。

  3. 获取数据后,设置属性值并继续查询目标方法。

17、Mybatis的一级、二级缓存用过吗?

候选人:

MyBatis的一级缓存是基于HashMap本地缓存,作用域为sqlSession,默认开启。二级缓存需要单独开启,作用域为Namespace或mapper,默认也是采用HashMap存储。

18、Mybatis的二级缓存什么时候会清理缓存中的数据?

候选人:

当作用域(一级缓存Session/二级缓存Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被清空。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 15:49:56

AI是怎么判断一家本地商家值得推荐的?云南老板看完这篇就懂了

在昆明开店这些年,最近经常听同行聊起一件事:客人不刷抖音也不翻百度了,直接打开豆包问一句“附近哪家靠谱”。但很多老板发现,自己的店在AI回答里几乎不出现。 这个问题背后,其实是一套和传统搜索完全不同的推荐逻辑。…

作者头像 李华
网站建设 2026/10/22 4:51:11

开题报告被判没有问题意识,从评审原话往回倒推

开题答辩结束,评审留下一句"没有问题意识",你回去翻自己的报告,发现研究问题明明就写在里面。卡住你的往往不是有没有写,而是写出来的东西没接上那句批语真正指的那一层。这里不讨论怎么从零提炼一个研究问题&#xff0…

作者头像 李华
网站建设 2026/10/20 7:43:24

参考文献核不上,源头多半出在题录本身

参考文献核不上,是很多人拖到定稿阶段才撞上的麻烦。先说结论:症结往往不在排版,也不在检索手法,而在更靠前的位置——那条题录究竟是怎么来的。定位澄清:一条参考文献核不上,问题出在哪一层核不上有几种典…

作者头像 李华
网站建设 2026/10/20 10:06:52

企业健身房配置指南:供应商评估与避坑策略

1. 项目背景与核心价值最近帮三家不同规模的企业完成了员工健身房配置项目,发现这个细分领域存在严重的信息不对称。企业HR和行政人员在采购时往往面临三大痛点:不知道如何评估供应商专业度、不清楚设备选型的黄金比例、对后续维护成本缺乏预判。这份排行…

作者头像 李华
网站建设 2026/10/19 16:47:04

【华为eSight】如何重置或暂停告警短信服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/20 21:39:30

JVM现场诊断四步法:jmap、jstack、参数、VisualVM实战指南

1. 这不是调参手册,而是JVM现场诊断的实战手记你有没有遇到过这样的场景:线上服务突然响应变慢,CPU飙到95%,但日志里找不到明显报错;或者凌晨三点收到告警,堆内存使用率持续98%不释放,重启能缓解…

作者头像 李华