导语:
Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,从容应对高阶提问。


一、面试主题概述

在 Spring 中,Bean 的作用域(Scope)定义了 Spring 容器中 Bean 的生命周期与访问范围。这是核心的 IOC 容器设计之一,对资源管理、线程安全及系统性能均有重要影响。

面试中,关于 Bean Scope 的问题,不仅会考基础定义,还可能深入追问其实际应用场景、多线程场景下的表现,甚至设计模式的关联。


二、高频面试题汇总

  1. Spring 中的 Bean 作用域有哪些?默认作用域是什么?
  2. singleton 和 prototype 有哪些区别?分别适合什么场景?
  3. request 和 session 作用域的底层实现原理是什么?
  4. 如果在 prototype Bean 中注入 singleton Bean,有什么需要注意的?
  5. 多线程环境下使用 request 或 session scope 的 Bean,会有什么问题?

三、重点题目详解

1️⃣ Spring 中的 Bean 作用域有哪些?

答:

Spring 支持以下 5 种主要作用域:

作用域说明适用场景
singleton默认作用域,全容器中只创建一个 Bean 实例大多数无状态服务类,如 DAO、Service
prototype每次获取都会创建新的 Bean 实例有状态对象,如自定义线程任务
request每次 HTTP 请求创建一个新的 Bean,只在当前请求内有效(仅限 Web 应用)Controller 层的临时对象
session每个 HTTP Session 创建一个 Bean 实例与用户登录态、购物车状态相关的数据
application每个 ServletContext 创建一个 Bean 实例Web 应用级共享资源,如配置缓存等

2️⃣ singleton 和 prototype 有哪些区别?

@Component
@Scope("singleton") // 默认是 singleton,也可以省略
public class SingletonBean {public SingletonBean() {System.out.println("创建 Singleton Bean");}
}@Component
@Scope("prototype")
public class PrototypeBean {public PrototypeBean() {System.out.println("创建 Prototype Bean");}
}

测试代码:

@SpringBootApplication
public class ScopeDemo implements CommandLineRunner {@Autowiredprivate ApplicationContext context;public static void main(String[] args) {SpringApplication.run(ScopeDemo.class, args);}@Overridepublic void run(String... args) {context.getBean(SingletonBean.class);context.getBean(SingletonBean.class);context.getBean(PrototypeBean.class);context.getBean(PrototypeBean.class);}
}

输出:

创建 Singleton Bean
创建 Prototype Bean
创建 Prototype Bean

解析:

  • singleton:容器启动时创建一次,之后每次注入或获取都是同一个实例。
  • prototype:每次调用 getBean() 都是新实例,生命周期不受容器管理,Spring 仅负责创建,销毁需手动处理。

常见误区: Prototype Bean 并不会像 Singleton 那样自动执行 @PreDestroy 等生命周期方法。


3️⃣ request 和 session 的实现机制

这些作用域依赖于 WebApplicationContext,并通过底层的 RequestContextHolder 维护线程上下文。

底层实现简析:

Spring 使用 ThreadLocal 维护每个线程对应的请求或会话对象,从而在非 Controller 中也能访问请求作用域 Bean。例如:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

面试官为什么爱问这个?

  • 考察对 Spring 与 Servlet 容器的理解
  • 是否具备 Web 环境下的线程模型意识
  • 是否能够区分请求级状态与全局状态

4️⃣ prototype Bean 中注入 singleton Bean 的问题

场景:

@Component
@Scope("prototype")
public class TaskHandler {@Autowiredprivate LoggerService loggerService; // singleton Bean
}

问题解析:

这是合法且常见的组合,singleton Bean 可以安全注入到 prototype Bean 中,因为它是无状态的。

但反过来若在 singleton Bean 中注入 prototype Bean,则只有第一次注入有效,后续不会重新创建实例,此时应使用 @LookupObjectFactory 获取:

@Component
public class TaskManager {@Lookuppublic TaskHandler getTaskHandler() {return null; // 由 Spring 动态实现}
}

四、面试官视角与加分项

面试官通常关注的不是你是否背过定义,而是:

  • 是否理解不同作用域的设计动机与应用边界
  • 能否通过实例解释作用域对系统行为的影响
  • 能否发现作用域使用不当引发的线程安全、资源浪费等问题

加分项建议:

  • 结合实际项目场景举例说明,比如电商系统中的购物车 session 管理。
  • 能提及 Spring Boot 中通过注解 @Scope、配置文件等方式灵活配置作用域。
  • 理解作用域与设计模式之间的关系,如 Singleton 模式、Factory 模式。

五、总结与建议

Spring 中的 Bean 作用域虽为基础知识点,但蕴含的设计哲学、线程模型和容器管理机制非常丰富。建议在面试中做到以下几点:

  • 基础熟记:掌握每种作用域的定义、特性与生命周期。
  • 深入理解:理解作用域的底层原理、适用场景及组合方式。
  • 实战经验:结合项目使用场景,自信地举出具体案例。

面试不怕问到基础,怕的是“只会背书,不懂变通”。理解 Bean 作用域的真正用意,你就能在细节中脱颖而出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/84389.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/84389.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/84389.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Spring Boot 策略模式的短信服务提供商动态切换实现

一、整体设计思路 为了实现在短信服务提供商变更时,不修改现有代码就能无缝切换到新服务实现,可采用策略模式结合依赖注入以及配置中心化管理的方式来设计软件系统。 二、 具体实现步骤 1. 定义统一接口(以短信服务为例,接口命名为 SmsService) 创建一个抽象的接口,用…

解决SQL Server SQL语句性能问题(9)——SQL语句改写(1)

9.4. SQL语句改写 目前主流关系库的高版本中,特别是作为主流商业关系库的SQL Server来讲,大部分场景中,同一语义和结果集的SQL语句,其不同写法并不会影响CBO为SQL语句生成和选择最合适、最高效的查询计划。但少数情况下,不同写法的同一语义和结果集的SQL语句,CBO也许会为…

设计模式复习小结

1.容易忘得设计原则 接口隔离:指接口中的功能太杂则可以拆分一下。防止实现类实现了接口后自动依赖了一些不需要的功能。不同功能拆分成不同的接口。 里氏代换:强调父类能出现的地方,子类一定能正常跑。 迪米特法则:又称最少知…

昇腾CANN集合通信技术解读——细粒度分级流水算法

随着AI技术的演进,模型的计算复杂度和参数量呈现几何级数增长,这使得传统单机单卡部署在算力供给与显存容量方面显得力不从心,从而直接推动了分布式训练/推理技术的快速发展。今年年初爆火的DeepSeek在训练及推理Prefill阶段采用了分级流水Al…

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…

React 进阶特性

1. ref ref 是 React 提供的一种机制,用于访问和操作 DOM 元素或 React 组件的实例。它可以用于获取某个 DOM 元素的引用,从而执行一些需要直接操作 DOM 的任务,例如手动设置焦点、选择文本或触发动画。 1.1. 使用 ref 的步骤 1. 创建一个 ref:使用 React.createRef 或 …

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…

【大厂机试题解法笔记】报文响应时间

题目 IGMP 协议中,有一个字段称作最大响应时间 (Max Response Time) ,HOST收到查询报文,解折出 MaxResponseTime 字段后,需要在 (0,MaxResponseTime] 时间 (s) 内选取随机时间回应一个响应报文,如果在随机…

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…

Python爬虫实战:研究demiurge框架相关技术

1. 引言 在当今数字化时代,互联网上蕴含着海量的有价值信息。爬虫技术作为获取这些信息的重要手段,被广泛应用于学术研究、商业分析、舆情监测等多个领域。然而,构建一个高效、稳定且可维护的爬虫系统面临诸多挑战,如网页结构复杂多变、反爬机制日益严格、数据处理流程繁琐…

Jenkins | Jenkins构建成功服务进程关闭问题

Jenkins构建成功服务进程关闭问题 1. 原因2. 解决 1. 原因 Jenkins 默认会在构建结束时终止所有由构建任务启动的子进程,即使使用了nohup或后台运行符号&。 2. 解决 在启动脚本中加上 BULID_IDdontkillme #--------------解决jenkins 自动关闭进程问题-----…

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…

猜字符位置游戏-position gasses

import java.util.*;public class Main {/*字符猜位置游戏;每次提交只能被告知答对几个位置;根据提示答对的位置数推测出每个字符对应的正确位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…

Towards Open World Object Detection概述(论文)

论文&#xff1a;https://arxiv.org/abs/2103.02603 代码&#xff1a;https://github.com/JosephKJ/OWOD Towards Open World Object Detection 迈向开放世界目标检测 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…

夏普比率(Sharpe ratio)​

具有投资常识的人都明白&#xff0c;投资光看收益是不够的&#xff0c;还要看承受的风险&#xff0c;也就是收益风险比。 夏普比率描述的正是这个概念&#xff0c;即每承受一单位的总风险&#xff0c;会产生多少超额的报酬。 用数学公式描述就是&#xff1a; 其中&#xff1…