spring面试高频问题---单例bean/aop/spring事务/springbean生命周期/循环依赖😄
Spring面试高频问题
一. spring的bean是线程安全的吗?
1. Spring单例bean
Spring框架中的bean默认是单例的,也可以修改为prototype.
singleton :bean在每个Spring IOC容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
2.单例bean是线程安全的吗?
例如,如下图所示
count是可修改的成员变量需要考虑线程安全。
userService是无法修改的成员变量不需要考虑线程安全,无状态的成员变量就是安全的。
3. 问题总结
4. 面试问答
二. spring-aop
1. 什么是AOP?项目中用到了吗
AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低模块间的耦合度,同时提高了系统的可维护性。
常见的AOP使用场景:
1.记录操作日志(每一个service记录操作)
2.缓存处理(业务加缓存,写在AOP的切面拦截需要添加缓存的业务方法)
3.Spring中内置的事务处理
2. AOP记录操作日志 登录日志等等
后台有四个请求接口,需要记录操作日志,使用AOP提供的环绕通知做一个切面,相当于一个通过的代码,遇到请求的时候就可以执行这段代码。
代码解释:https://zhuanlan.zhihu.com/p/596205936?utm_id=0
3.spring事务如何实现的
Spring支持编程式事务管理和声明式事务管理两种方式。
- 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用
- 声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。(常用)
4. 问题总结
三. spring事务失效的场景
1. spring事务失效的场景有哪些?
对spring框架的深入理解、复杂业务的编码经验
- 异常捕获处理
- 抛出检查异常
- 非public方法
情况一:异常捕获处理
转账的代码中出现一个异常,由于这个异常会被try-catch捕获却没有抛出,所以可能导致事务失效(如果异常没有被捕获,就会发生事务回滚)
原因分析: 事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决方法: 在catch块添加throw new RuntimeException(e)抛出
情况二:抛出检查异常
系统找不到指定文件,抛出一个检查异常
原因分析: Spring 默认只会回滚非检查异常
解决方法: 配置rollbackFor属性Transactional(rollbackFor=Exception.class),一旦出现异常都会被事务控制
情况三:非public方法导致事务失效
方法没有用public
原因分析: Spring为方法创建代理、添加事务通知、前提条件都是该方法是public的
解决方法: 方法改为public
问题总结
四. spring-bean的生命周期(难)
1. spring中bean的生命周期
Spring容器是如何管理和创建bean实例
方便调试和解决问题
2. BeanDefinition(Bean的定义信息)
Spring容器在进行实例化时,会将xml配置的
3. 问题总结
五. Spring-bean的循环依赖
1. spring的循环引用
在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象
2. Spring的循环依赖
Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:
如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存。
一级和二级缓存可以解决一般对象的循环依赖
代理对象需要用到三级缓存
构造方法注入产生的循环依赖问题,使用延迟加载解决问题
3. 问题总结
本文来自博客园,作者:xiaolifc,转载请注明原文链接:https://www.cnblogs.com/xiaolibiji/p/18053553
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~