Bean 作用域有哪些?如何答出技术深度?

news2025/6/12 4:19:41

导语:
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 {

    @Autowired
    private ApplicationContext context;

    public static void main(String[] args) {
        SpringApplication.run(ScopeDemo.class, args);
    }

    @Override
    public 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 {
    @Autowired
    private LoggerService loggerService; // singleton Bean
}

问题解析:

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

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

@Component
public class TaskManager {

    @Lookup
    public TaskHandler getTaskHandler() {
        return null; // 由 Spring 动态实现
    }
}

四、面试官视角与加分项

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

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

加分项建议:

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

五、总结与建议

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web后端基础(基础知识)

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言: 类加载器 1. …

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…