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

導語:
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…