编辑
2026-03-04
java
00
请注意,本文编写于 40 天前,最后修改于 31 天前,其中某些信息可能已经过时。

目录

相关问题概览
(1)Spring中的单例bean是线程安全的吗
(2)什么是AOP
(3)Spring框架中事务失效的情况
1.异常捕获处理
2.抛出检查异常
3.非public方法导致事务失效
(4)Spring Bean的生命周期
(5)Spring中的循环引用问题
(6)Spring MVC的执行流程
(7)SpringBoot自动配置原理
(8)SpringBoot常见的注解

相关问题概览

image.png

(1)Spring中的单例bean是线程安全的吗

image.png

面试话术

image.png

1. Spring框架中的单例bean是线程安全的吗? 候选人: 不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装,线程安全和并发问题需要开发者自行处理。 通常在项目中使用的Spring bean是不可变状态(如Service类和DAO类),因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态(如ViewModel对象),就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。

(2)什么是AOP

image.png

image.png

面试话术

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

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

(3)Spring框架中事务失效的情况

1.异常捕获处理

image.png

需要在catch中抛出异常

2.抛出检查异常

image.png

需要添加注释

image.png

3.非public方法导致事务失效

image.png

面试话术

image.png

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

5. Spring中事务失效的场景有哪些? 候选人: 在项目中,我遇到过几种导致事务失效的场景 ;1. 如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。 ;2. 如果方法抛出检查型异常(checked exception),并且没有在@Transactional注解上配置rollbackFor属性为Exception,那么异常发生时事务可能不会回滚。 ;3. 如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。

(4)Spring Bean的生命周期

image.png

面试话术

6. Spring的bean的生命周期? 候选人: Spring中bean的生命周期包括以下步骤: ;1. 通过BeanDefinition获取bean的定义信息。 ;2. 调用构造函数实例化bean。 ;3. 进行bean的依赖注入,例如通过setter方法或@Autowired注解。 ;4. 处理实现了Aware接口的bean。 ;5. 执行BeanPostProcessor的前置处理器。 ;6. 调用初始化方法,如实现了InitializingBean接口或自定义的init-method。 ;7. 执行BeanPostProcessor的后置处理器,可能在这里产生代理对象。 ;8. 最后是销毁bean。

(5)Spring中的循环引用问题

问题产生原因

image.png

三级缓存解决循环依赖

image.png

构造方法出现循环依赖的问题

image.png

面试话术

7. Spring中的循环引用? 候选人: 循环依赖发生在两个或两个以上的bean互相持有对方,形成闭环。Spring框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题: ;1. 一级缓存:单例池,缓存已完成初始化的bean对象。 ;2. 二级缓存:缓存尚未完成生命周期的早期bean对象。 ;3. 三级缓存:缓存ObjectFactory,用于创建bean对象。

8. 那具体解决流程清楚吗? 候选人: 解决循环依赖的流程如下: ;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。

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

(6)Spring MVC的执行流程

视图阶段

image.png

前后端分离阶段

image.png

面试话术

image.png

10. 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渲染视图并响应用户。

(7)SpringBoot自动配置原理

image.png

面试话术

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

(8)SpringBoot常见的注解

spring

image.png

springMVC

image.png

SpringBoot

image.png

本文作者:钱小杰

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!