当前位置: 首页 > article >正文

Spring面试题 01

目录1. 谈谈你对 AOP 的理解2. 谈谈你对 IOC 的理解3. 解释下 Spring 支持的几种 Bean 的作用域4. 简述 Spring 中的事务的实现方式5. 了解 Spring 中的事务传播机制吗6. 说一说 Spring 事务的底层实现逻辑7. Spring 事务什么时候会失效8. 什么是 Bean 的自动装配有哪些模式9. Spring 中 Bean 是线程安全的吗10. 如何应对单例 Bean 的线程安全问题呢 面试加分小贴士这是一份非常经典的 Spring 核心面试题清单涵盖了AOP、IOC、Bean 管理、事务机制四大核心板块。针对大厂面试如华为、字节、美团回答不能仅停留在“背诵定义”而要体现“原理理解 场景应用 避坑经验”。以下是为你整理的高分回答话术采用“结论先行 - 原理解析 - 场景/细节 - 总结”的逻辑结构。1. 谈谈你对 AOP 的理解关键词解耦、横切关注点、动态代理、责任链核心结论AOP面向切面编程的核心目的是解耦。它将那些与业务逻辑无关却为多个模块共同关注的功能如日志、事务、权限控制封装起来减少重复代码。原理解析底层基于动态代理实现。如果目标类实现了接口默认使用JDK 动态代理如果没有实现接口则使用CGLIB 代理生成子类。核心概念包括切面Aspect、连接点JoinPoint、通知Advice如 Before/After/Around、切入点Pointcut。应用场景最典型的就是 Spring 的声明式事务Transactional和全局日志记录。个人思考在实际开发中我常用 AOP 做统一的数据脱敏或接口耗时统计。需要注意的是AOP 本质是代理对象所以在类内部调用Self-Invocation时AOP 可能会失效因为绕过了代理对象。2. 谈谈你对 IOC 的理解关键词控制反转、依赖注入、解耦、容器管理核心结论IOC控制反转是一种设计思想DI依赖注入是其具体实现。核心是将对象的创建、初始化、销毁等生命周期控制权从代码中移交给Spring 容器管理。原理解析传统模式下对象 A 需要主动new对象 B耦合度高。IOC 模式下A 只需要声明“我需要 B”容器会在运行时自动将 B 注入给 A。底层核心是BeanFactory和ApplicationContext通过反射机制实例化对象并利用Map结构存储 Bean 实例单例池。优势极大降低了模块间的耦合度方便单元测试和模块替换。个人思考IOC 让开发者更专注于业务逻辑本身而不是基础设施的搭建。但也要注意过度依赖 IOC 可能导致项目启动变慢因为要扫描和初始化大量 Bean所以在大型项目中我们会按需加载或使用懒加载Lazy。3. 解释下 Spring 支持的几种 Bean 的作用域关键词Singleton, Prototype, Request, Session核心结论Spring 默认是单例Singleton但也支持多例和其他 Web 作用域。详细分类Singleton单例默认模式。整个 Spring 容器中只有一个实例线程不安全适合无状态的 Service/Dao。Prototype多例/原型每次请求都创建一个新实例适合有状态的对象如 Struts2 的 Action。Request一次 HTTP 请求一个实例仅限 Web 环境。Session一个 HTTP Session 一个实例仅限 Web 环境。Application整个 ServletContext 生命周期内一个实例。注意点如果在 Singleton Bean 中注入 Prototype Bean直接注入会导致 Prototype 失效因为 Singleton 只初始化一次。此时需要通过ObjectFactory或Lookup注解来解决。4. 简述 Spring 中的事务的实现方式关键词编程式 vs 声明式、AOP、Transactional核心结论主要有两种方式编程式事务和声明式事务。实际开发中 99% 的情况都用声明式事务。对比分析编程式使用TransactionTemplate或在代码中手动管理commit/rollback。优点是粒度控制精确缺点是代码侵入性强维护困难。声明式基于AOP实现。只需在方法或类上添加Transactional注解。Spring 会在方法执行前后自动拦截开启事务、提交或回滚。底层逻辑声明式事务本质是 Spring 通过动态代理生成的一个代理对象包裹了目标方法在调用前后织入事务管理逻辑。5. 了解 Spring 中的事务传播机制吗关键词REQUIRED, REQUIRES_NEW, NESTED核心结论传播行为定义了当一个事务方法被另一个事务方法调用时这个事务方法应该如何运行。Spring 定义了 7 种最常用的是前 3 种。重点详解REQUIRED默认如果当前存在事务则加入该事务如果不存在则新建一个事务。父子同生共死REQUIRES_NEW不管当前是否存在事务都挂起当前事务新建一个新事务。子事务独立父事务异常不影响子事务提交反之亦然NESTED如果当前存在事务则在嵌套事务内执行保存点机制如果不存在则按 REQUIRED 处理。子事务可以单独回滚而不影响父事务但父事务回滚会导致子事务也回滚场景举例比如注册送积分注册是主事务送积分是子事务。如果希望注册失败积分也不送用REQUIRED如果希望即使注册失败已经送的积分也要保留极少见或者送积分失败不影响注册成功可以用REQUIRES_NEW。6. 说一说 Spring 事务的底层实现逻辑关键词DataSourceTransactionManager, ThreadLocal, 代理对象核心结论Spring 事务底层依赖于数据库连接池和ThreadLocal。流程解析Spring 通过DataSourceTransactionManager管理事务。当开启事务时Spring 会从数据源获取一个 Connection并将该 Connection 绑定到当前线程的ThreadLocal中。后续在该线程内的所有数据库操作都会从 ThreadLocal 中获取同一个 Connection从而保证在同一个事务中。方法执行成功提交事务并移除 ThreadLocal方法抛出异常回滚事务并移除 ThreadLocal。关键点这就是为什么事务必须在同一个线程内才有效的原因。如果是多线程异步调用ThreadLocal 拿不到同一个 Connection事务就会失效。7. Spring 事务什么时候会失效关键词自调用、非 public、异常捕获、多线程、数据库引擎核心结论事务失效通常是因为绕过了 Spring 的代理对象或配置不当。常见场景如下同类自调用方法 A有事务调用本类的方法 B有事务B 的事务会失效。因为 A 调用 B 是this.B()没有经过代理对象。-解决注入自身或使用 AopContext。方法修饰符非 publicTransactional只能用在 public 方法上。异常被吞掉方法内部try-catch了异常但没有抛出Spring 感知不到异常不会回滚。-解决catch 中手动抛出 RuntimeException 或调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()。异常类型不匹配默认只回滚RuntimeException和Error。如果抛出 Checked Exception如 IOException且未配置rollbackFor不会回滚。数据库引擎不支持如 MySQL 使用了 MyISAM 引擎不支持事务必须用 InnoDB。多线程调用不同线程无法共享事务上下文。8. 什么是 Bean 的自动装配有哪些模式关键词byType, byName, Constructor, Autowired核心结论自动装配是指 Spring 容器自动检测并注入 Bean 之间的依赖关系无需手动new或配置 XML。装配模式byType根据类型匹配。如果容器中有多个同类型的 Bean会报错。byName根据属性名匹配 Bean 的 ID。Constructor通过构造函数注入推荐保证依赖不可变且非空。No不自动装配。注解实现Autowired默认按类型装配。配合Qualifier(beanName)可按名称装配。Resource默认按名称装配JSR-250 标准。个人思考在构造器注入中如果一个类有多个构造函数Spring 会选择参数最多的那个如果只有一个无论是否有Autowired都会自动注入。9. Spring 中 Bean 是线程安全的吗核心结论不是绝对的取决于 Bean 的作用域和是否包含可变状态。具体分析Singleton单例Spring 容器中的 Bean 默认是单例的。如果 Bean 是无状态的如 Service、Dao只包含方法逻辑不存成员变量则是线程安全的。有状态风险如果单例 Bean 中定义了可变的成员变量如private int count;并且多个线程同时修改它就会出现线程安全问题。Prototype多例每次请求 new 一个新对象天然线程安全因为每个线程操作的都是不同的对象实例。总结Spring 并不保证 Bean 的线程安全线程安全责任在于开发者。最佳实践是尽量将 Service/Controller 设计为无状态的。10. 如何应对单例 Bean 的线程安全问题呢关键词避免成员变量、ThreadLocal、锁、原型作用域方案一推荐避免使用可变的成员变量。将局部变量定义在方法栈中天然线程隔离。如果必须共享数据考虑放入 Redis 或数据库中。方案二使用ThreadLocal。将成员变量封装在ThreadLocal中确保每个线程拥有独立的变量副本。这是解决单例线程安全最常用的手段如 Spring 的事务管理器、UserContext。方案三加锁Synchronized / Lock。对临界区代码加锁。但会降低并发性能一般不推荐用于高并发业务逻辑。方案四改变作用域。将 Bean 的作用域改为Prototype多例但这会增加内存开销和 GC 压力通常不作为首选。方案五使用不可变类。如果成员变量必须存在将其声明为final且初始化后不再修改。 面试加分小贴士结合源码在回答第 6 题底层逻辑时如果能提到PlatformTransactionManager接口或TransactionInterceptor类会让面试官眼前一亮。结合业务在回答第 7 题失效场景时一定要举一个自己项目中遇到的真实例子比如“我之前在做订单模块时因为 try-catch 导致事务没回滚后来通过...解决了”这比纯理论更有说服力。条理清晰回答问题时先说结论再分点阐述最后做个小总结。

相关文章:

Spring面试题 01

目录 1. 谈谈你对 AOP 的理解? 2. 谈谈你对 IOC 的理解? 3. 解释下 Spring 支持的几种 Bean 的作用域? 4. 简述 Spring 中的事务的实现方式? 5. 了解 Spring 中的事务传播机制吗? 6. 说一说 Spring 事务的底层实…...

没有学不会的义务之动态内存管理

为什么要有动态内存管理:让程序员自己可以申请和释放空间(数组等开辟空间的大小是固定的)内存中的不同区malloc函数功能:向内存的堆区申请一块连续可用的空间,并返回指向这块空间的起始地址。1.如果开辟成功&#xff0…...

sql注入之sql基本语法

(持续更新)学习网站推荐:www.w3school.com.cnsqlzoo.net一、SELECT查询语句SELECT 列 FROM 表 WHERE 条件;SQL SELECT 语法SELECT 列名称 FROM 表名称以及:SELECT * FROM 表名称1.SELECT population FROM world WHERE name Germany主要目的是输出人口&a…...

字节码优化、存储布局与那次成功的“代码混淆”

# 字节码优化、存储布局与那次成功的“代码混淆”## 引言:从一个小想法到一场技术革命故事要从几年前的一个午后说起。当时我们团队正在为一个嵌入式设备开发一套领域特定语言(DSL)。设备资源有限,我们需要一个轻量级的虚拟机来执…...

简中互联网“四大恶人”批判:一种数字生存境况的技术社会学分析

內容來自知乎:https://www.zhihu.com/question/660840540 # 简中互联网“四大恶人”批判:一种数字生存境况的技术社会学分析 ## 引言:被围困的数字日常 2026年的今天,当你打开手机准备查询地铁线路,仅仅因为起身时轻…...

RAG——RAG生成(大模型)

目录 一、前提 二、大模型发展 三、大模型原理 四、RAG 中如何选择大模型 本文来源:极客时间vip课程笔记 注:后续技术类文章会同步到我的公众号里,搜索公众号 小志的博客 感兴趣的读友可以去找来看看。 一、前提 RAG 的本质是通过为大模型提供外部知识来增强其理解和回答领…...

IntelliJ IDEA 4个必改配置:主题字体+代码提示+免费AI插件,让你的开发体验起飞

IntelliJ IDEA 被誉为 Java 开发最好用的工具,但默认配置不一定适合每个人。默认的暗黑主题在白天长时间开发容易眼疲劳;默认字体偏小,盯着看一会儿眼睛就酸;默认的代码提示严格区分大小写,输入小写就找不到大写开头的…...

HelloWorld的前世今生:用IntelliJ IDEA编写人生第一个Java程序

为什么全世界所有编程语言的第一个例子,都是输出“Hello World”?这个传统来自C语言之父丹尼斯里奇的经典著作《C程序设计语言》。在这本书中,第一个示例程序就是输出“Hello World”。由于C语言是绝大多数编程语言的鼻祖,后续Jav…...

计算机毕业设计springboot高校体育竞赛管理系统 基于SpringBoot的高校体育赛事综合服务平台设计与实现

计算机毕业设计springboot高校体育竞赛管理系统48825p75(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着高校体育事业的蓬勃发展和校园文化建设需求的不断提升,传…...

计算机毕业设计springboot就业岗位推荐系统 基于SpringBoot的智能职位匹配平台设计与实现

计算机毕业设计springboot就业岗位推荐系统a6nq8o76(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着数字化转型的深入推进,人力资源市场正经历从传统招聘模式向智…...

2025年智能座舱交互革命:从语音助手到多模态AI中枢

1. 告别“人工智障”:为什么你的车载语音助手总在关键时刻掉链子? 不知道你有没有过这样的经历:开车时想调低空调温度,对着车机喊了好几声“你好,XX”,它要么没反应,要么答非所问,最…...

R 4.5量化回测合规红线预警:证监会《证券期货业回测系统技术规范》V2.3落地后,这7类代码将被认定为无效回测

第一章:R 4.5量化回测合规性总览R 4.5 版本在统计计算与金融建模领域引入了多项增强机制,尤其在回测框架的可审计性、随机数生成确定性、时间序列对齐一致性及浮点运算精度控制方面,显著提升了量化策略回测结果的合规可信度。监管机构&#x…...

STEP3-VL-10B部署案例:边缘计算节点部署10B模型实现离线多模态推理

STEP3-VL-10B部署案例:边缘计算节点部署10B模型实现离线多模态推理 1. 引言 想象一下,你正在一个网络信号不稳定的野外现场,或者在一个对数据安全要求极高的企业内部,需要快速分析一张复杂的工程图纸,或者理解一段带…...

如何用Dify在24小时内完成传统需2周的人工评估闭环?——金融客服场景下LLM-as-a-judge SLO达标实践白皮书

第一章:LLM-as-a-judge在金融客服评估中的范式革命传统金融客服质量评估长期依赖人工抽检、规则引擎与预设话术匹配,存在覆盖率低、主观性强、反馈滞后等结构性瓶颈。大语言模型作为裁判(LLM-as-a-judge)的引入,正推动…...

通义千问3-Reranker-0.6B实战案例:直播带货话术与商品信息匹配

通义千问3-Reranker-0.6B实战案例:直播带货话术与商品信息匹配 1. 直播带货的痛点与解决方案 直播带货现在火得不得了,但有个问题一直困扰着主播和运营团队:说的话和卖的商品经常对不上。你可能也遇到过这种情况——主播说得天花乱坠&#…...

Emilia数据集:6种语言10万小时语音生成技术的突破与应用

1. Emilia数据集:一个改变游戏规则的多语言语音宝库 如果你最近在关注语音合成(TTS)或者语音生成领域,那你大概率已经听过“Emilia”这个名字了。它就像一个突然出现在舞台中央的超级新星,让整个圈子都兴奋了起来。简…...

第7章:Docker network网络管理_(网络驱动类型)

第7章:Docker network网络管理(网络驱动类型) 在现代容器化应用部署中,Docker网络管理是确保服务可靠通信的关键环节。除了基础的网络连接操作外,Docker提供了一系列高级网络功能,能够满足复杂场景下的网络需求。本文将解析三个高级网络管理命令: docker network connec…...

连续时间马尔科夫链:从理论到生灭过程的应用解析

1. 从排队到种群:为什么我们需要连续时间马尔科夫链? 想象一下,你正在一家网红奶茶店排队。队伍的长度时增时减,有人买完离开(“死亡”),也有新顾客加入队尾(“出生”)。…...

UNIAPP 上架审核指南:精准应对 Guideline 5.1.2 数据追踪与隐私合规

1. Guideline 5.1.2 到底是什么?为什么你的UNIAPP应用会踩坑? 最近不少用UNIAPP开发iOS应用的朋友,在提交App Store Connect审核时,都遇到了一个让人头疼的拒绝理由:Guideline 5.1.2。苹果给出的原文通常很长&#xf…...

文件描述符fd:跨进程共享机制

文件描述符跨进程资源共享机制详解 文件描述符作为 Unix/Linux 系统的核心抽象机制,通过精巧的内核设计实现了高效的跨进程资源共享。下面从技术原理、实现机制和实际应用三个维度深入解析这一过程。 一、核心技术原理 1. 文件描述符的本质 文件描述符实际上是进…...

实战避坑指南:基于RocketMQ 5.2 Proxy的两主两从集群部署与关键配置解析

1. 为什么你需要这份“踩坑”指南? 最近有不少朋友在后台问我,想在生产环境部署RocketMQ 5.2的集群,特别是带Proxy的两主两从架构,但照着网上一些零散的教程做,总是卡在某个环节,要么服务起不来&#xff0c…...

天地图结合GeoJSON实现中国行政区划可视化开发指南

1. 为什么选择天地图GeoJSON做行政区划可视化? 如果你正在做一个政务系统、数据分析平台,或者任何需要在地图上清晰展示中国省、市、县边界的项目,那你大概率绕不开“行政区划可视化”这个需求。几年前,我为了这个功能可没少折腾&…...

从零到一:Gemini AI Studio 实战部署与避坑指南

1. 初识 Gemini AI Studio:你的 AI 应用“游乐场” 如果你对 AI 感兴趣,想自己动手做个聊天机器人、智能助手,或者任何带点“智能”的小应用,但一看到“模型训练”、“微调”、“部署”这些词就头疼,觉得那是专业开发…...

Crystals Kyber密钥封装机制解析:从LWE问题到实际应用

1. 为什么我们需要Kyber?从RSA的“中年危机”说起 如果你用过网银、登录过邮箱,或者只是在网站上看到那个小锁图标,那你其实已经和公钥密码学打过无数次交道了。我们最熟悉的老朋友,莫过于RSA和ECC(椭圆曲线密码&#…...

Windsurf实战:AI代码编辑器的智能协作开发全解析

1. 初识Windsurf:不只是编辑器,更是你的AI编程搭档 如果你还在用传统的代码编辑器,每天重复着敲击键盘、查找文档、调试错误的循环,那今天这篇文章可能会彻底改变你对编程的认知。Windsurf,这款在2024年底横空出世的AI…...

揭秘这款零成本抢票神器:十年口碑,无广告无加速包!

1. 为什么你需要一个“干净”的抢票工具? 又到了一年一度考验手速和网速的时候了。打开手机里那些主流的购票App,想抢张回家的票,迎面而来的不是“助力加速”,就是“VIP光速通道”,各种加速包、会员权益的弹窗让人眼花…...

金蝶EAS uploadlogo任意文件上传漏洞深度分析与防护策略

1. 从一次“意外”的服务器告警说起 那天下午,我正在工位上摸鱼,突然手机开始疯狂震动,一看是监控平台的告警短信,提示某台核心业务服务器的CPU使用率飙升到了98%。我心里咯噔一下,赶紧连上去看。登录服务器一看&#…...

【光影绘梦】触控灯光画小夜灯:基于PT2023S8与SY7200A的双色温无极调光DIY方案解析

【光影绘梦】触控灯光画小夜灯:从电路到实物的DIY全解析 最近有不少朋友问我,想自己动手做一个既有颜值又有科技感的小夜灯,最好还能触摸调光调色温,有没有什么好的方案?这不,我最近刚好用立创的元器件和工…...

lsquic实战《一》—— 架构解析与核心概念入门

1. 初识lsquic:它是什么,以及为什么选择它 如果你正在寻找一个用C语言实现的、功能齐全且文档相对友好的QUIC协议库来开发你的网络应用,那么lsquic很可能已经进入了你的视野。我当初选择它,也是基于类似的考量:项目需要…...

AirSim实战指南:从零构建Python无人机控制脚本

1. 环境准备:搭建你的第一个AirSim仿真世界 想用Python控制无人机在天上自由翱翔,听起来很酷对吧?但别急着写代码,咱们得先把“舞台”搭好。这个舞台就是AirSim,一个由微软开源的、基于游戏引擎(通常是Unre…...