Spring 依賴注入詳解:創建 Bean 和注入依賴是一回事嗎?

1. 什么是依賴注入(Dependency Injection,DI)?

依賴注入 是 Spring IoC(控制反轉)容器的核心功能。它的目標是將對象的依賴(如其他對象或配置)從對象本身中剝離,由容器負責注入這些依賴。

關鍵概念:
  • 依賴: 一個對象需要的其他對象或資源。例如,UserController 需要 UserService
  • 注入: Spring 容器在創建對象時,將依賴對象傳遞給它,而不是對象自己去創建。

2. Bean 創建與依賴注入的關系

Bean 創建:

  • Spring 容器根據定義(如 XML 配置、注解或 Java 配置)實例化一個類,生成一個對象。

依賴注入:

  • 創建 Bean 之后,Spring 容器會檢查這個對象是否有依賴項,并將所需的依賴注入進去。
兩者的區別:
  • Bean 創建: 生成一個對象的實例。
  • 依賴注入: 為創建的對象注入其所需的依賴。
聯系:
  • 依賴注入是 Bean 創建過程中的一部分,必須先創建 Bean 才能注入依賴。

3. 依賴注入的三種方式

Spring 提供了三種主要的依賴注入方式:構造器注入Setter 注入字段注入


(1) 構造器注入

通過類的構造器將依賴傳遞給對象。

優點:

  • 保證依賴在對象創建時就被注入,避免空指針異常。
  • 強制依賴項必須提供,增強對象的不可變性。

示例代碼:

@Component
public class UserController {private final UserService userService;// 使用構造器注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
}

XML 配置方式:

<bean id="userController" class="com.example.UserController"><constructor-arg ref="userService"/>
</bean>

(2) Setter 注入

通過 Setter 方法注入依賴。

優點:

  • 更靈活,可以在對象創建后設置或修改依賴。
  • 適合可選依賴的場景。

示例代碼:

@Component
public class UserController {private UserService userService;// 使用 Setter 注入@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
}

XML 配置方式:

<bean id="userController" class="com.example.UserController"><property name="userService" ref="userService"/>
</bean>

(3) 字段注入

直接將依賴注入到類的字段上。

優點:

  • 簡潔,代碼更少。
  • 不需要顯式構造器或 Setter 方法。

缺點:

  • 難以單元測試,因為字段是私有的,不能通過構造器或方法替換依賴。
  • 不符合 SOLID 原則中的單一責任原則。

示例代碼:

@Component
public class UserController {@Autowiredprivate UserService userService; // 字段注入
}

推薦使用: 構造器注入 > Setter 注入 > 字段注入(特殊情況可用)。


4. Spring 容器如何管理 Bean 的生命周期

Spring 容器通過以下幾個階段管理 Bean 的生命周期:

(1) Bean 的定義和加載
  • 通過配置文件(XML、Java 配置、注解)加載 Bean 定義。
  • 容器解析 Bean 的依賴關系。
(2) Bean 的實例化
  • 容器根據定義,通過構造器或工廠方法實例化 Bean。
(3) 依賴注入
  • 容器將所需的依賴對象注入到 Bean 中。
(4) 初始化
  • 容器調用初始化方法(如 @PostConstructinit-method)進行初始化邏輯。
(5) Bean 的使用
  • Bean 準備就緒后,由應用程序調用。
(6) 銷毀
  • 容器關閉時,調用銷毀方法(如 @PreDestroydestroy-method)。

5. 示例場景和常見問題
示例場景:用戶登錄
@Component
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public User login(String username, String password) {return userService.authenticate(username, password);}
}

依賴注入過程:

  1. Spring 容器加載 UserControllerUserService 的定義。
  2. 容器創建 UserService 的實例。
  3. 容器創建 UserController 的實例,并將 UserService 注入到它的構造器中。
常見問題:
  1. 循環依賴問題:A 依賴 B,而 B 也依賴 A,會導致 Bean 無法創建。
    • 解決方案: 將其中一個依賴改為 Setter 注入或使用 @Lazy
  2. 依賴注入失敗: 如果 Spring 容器中沒有找到需要注入的 Bean,會拋出異常。
    • 解決方案: 確保所有需要的 Bean 都被正確注冊。

6. 總結
  • 依賴注入的本質: 容器負責將對象需要的依賴注入進來,解除了對象之間的緊耦合。
  • Bean 創建與依賴注入: Bean 創建是依賴注入的前提,依賴注入是 Bean 生命周期中的一個步驟。
  • 三種注入方式: 構造器注入優先,其次是 Setter 注入,字段注入僅適用于特定場景。
  • Spring 容器的管理: 通過完整的生命周期管理,Spring 容器讓開發者專注于業務邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66742.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI時代的網絡安全:傳統技術的落寞與新機遇

AI時代的網絡安全&#xff1a;傳統技術的落寞與新機遇 在AI技術飛速發展的浪潮中&#xff0c;網絡安全領域正經歷著前所未有的變革。一方面&#xff0c;傳統網絡安全技術在面對新型攻擊手段時逐漸顯露出局限性&#xff1b;另一方面&#xff0c;AI為網絡安全帶來了新的機遇&…

后端開發Web

Maven Maven是apache旗下的一個開源項目&#xff0c;是一款用于管理和構建java項目的工具 Maven的作用 依賴管理 方便快捷的管理項目依賴的資源&#xff08;jar包&#xff09;&#xff0c;避免版本沖突問題 統一項目結構 提供標準、統一的項目結構 項目構建 標準跨平臺(…

前沿技術趨勢洞察:2024年技術的嶄新篇章與未來走向!

引言 時光飛逝&#xff0c;2024年已經來臨&#xff0c;回顧過去一年&#xff0c;科技的迅猛進步簡直讓人目不暇接。 在人工智能&#xff08;AI&#xff09;越來越強大的今天&#xff0c;我們不再停留在幻想階段&#xff0c;量子計算的雛形開始展示它的無窮潛力&#xff0c;Web …

【10.2】隊列-設計循環隊列

一、題目 設計你的循環隊列實現。 循環隊列是一種線性數據結構&#xff0c;其操作表現基于 FIFO&#xff08;先進先出&#xff09;原則并且隊尾被連接在隊首之后以形成一個循環。它也被稱為“環形緩沖器”。 循環隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普…

博客之星2024年度總評選——我的年度創作回顧與總結

2024年&#xff0c;是我在CSDN博客上持續耕耘、不斷成長的一年。在此&#xff0c;與大家分享一下我的年度創作回顧與總結。 一、創作成長與突破 在人工智能領域&#xff0c;技術迭代迅速&#xff0c;知識更新頻繁。為了保持自己的競爭力&#xff0c;在今年&#xff0c;我始終…

IDEA運行Java項目總會報程序包xxx不存在

我的在另外一臺電腦上跑是沒有問題的&#xff0c;在新的電腦上跑的時候&#xff0c;又出現了這個惡心的問題...... 思來想去&#xff0c;唯一的問題就是我的mavn環境沒的配置好 如何在本地部署mavn環境&#xff0c;這里推薦一篇很好的文章&#xff1a; Maven安裝與配置&…

java 根據前端傳回的png圖片數組,后端加水印加密碼生成pdf,返回給前端

前端傳回的png圖片數組&#xff0c;后端加水印加密碼生成pdf&#xff0c;返回給前端 場景&#xff1a;重點&#xff1a;maven依賴controllerservice 場景&#xff1a; 當前需求&#xff0c;前端通過html2canvas將頁面報表生成圖片下載&#xff0c;可以仍然不滿意。 需要java后…

數據分庫分表和遷移方案

在我們業務快速發展的過程中&#xff0c;數據量必然也會迎來突飛猛漲。那么當我們的數據量百倍、千倍、萬倍、億倍增長后&#xff0c;原有的單表性能就不能滿足我們日常的查詢和寫入了&#xff0c;此時數據架構就不得不進行拆分&#xff0c;比如單表拆分成10張表、100張表、單個…

線上突發:MySQL 自增 ID 用完,怎么辦?

線上突發&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么辦&#xff1f; 1. 問題背景2. 場景復現3. 自增id用完怎么辦&#xff1f;4. 總結 1. 問題背景 最近&#xff0c;我們在數據庫巡檢的時候發現了一個問題&#xff1a;線上的地址表自增主鍵用的是int類型。隨著業務越做越…

[Java] Solon 框架的三大核心組件之一插件擴展體系

1、Solon 的三大核心組件 核心組件說明Plugin 插件擴展機制提供“編碼風格”的擴展體系Ioc/Aop 應用容器提供基于注入依賴的自動裝配體系ContextHandler 通用上下文處理接口提供“開放式處理”適配體系&#xff08;俗稱&#xff0c;三元合一&#xff09; 2、Solon Plugin 插件…

TRELLIS微軟的圖生3D

TRELLIS 教程目錄&#xff1a; Youtube&#xff1a;https://www.youtube.com/watch?vJqFHZ-dRMhI 官網地址&#xff1a;https://trellis3d.github.io/ GitHub&#xff1a;https://github.com/Microsoft/TRELLIS 部署目錄&#xff1a; 克隆項目 git clone --recurse-submodul…

Java導出通過Word模板導出docx文件并通過QQ郵箱發送

一、創建Word模板 {{company}}{{Date}}服務器運行情況報告一、服務器&#xff1a;總告警次數&#xff1a;{{ServerTotal}} 服務器IP:{{IPA}}&#xff0c;總共告警次數:{{ServerATotal}} 服務器IP:{{IPB}}&#xff0c;總共告警次數:{{ServerBTotal}} 服務器IP:{{IPC}}&#x…

【22】Word:小李-高新技術企業政策?

目錄 題目? NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在刪除空白行等要求&#xff0c;可以到最后來完成。注意最后一定要檢查此部分&#xff01;注意&#xff1a;大多是和事例一樣即可&#xff0c;不用一摸一樣&#xff0c;但也不要差太多。 題目 NO1.2 F12Fn&a…

自動化部署(三):項目管理平臺

一、項目管理平臺作用 幫助團隊高效規劃、執行和監控項目進度&#xff0c;確保任務按時完成并實現目標 敏捷開發&#xff1a;提供標準敏捷研發管理&#xff0c;支持Scrum 與 Kanban 規模化敏捷&#xff1a;支持大型研發團隊跨項目協同&#xff0c;實現多項目路線圖規劃和資源管…

常用集合-數據結構-MySql

目錄 java核心&#xff1a; 常用集合與數據結構: 單例集合: 雙列集合: 線程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue隊列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP屬地與視頻定位位置不一致:現象解析與影響探討

在數字化時代&#xff0c;IP屬地和視頻定位位置已成為我們獲取網絡信息、判斷內容真實性的重要依據。然而&#xff0c;有時我們會發現&#xff0c;某些視頻內容中展示的定位位置與其發布者的IP屬地并不一致。這種不一致現象引發了廣泛的關注和討論。本文旨在深入剖析IP屬地與視…

計算機畢業設計hadoop+spark股票基金推薦系統 股票基金預測系統 股票基金可視化系統 股票基金數據分析 股票基金大數據 股票基金爬蟲

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

機器學習-數據集劃分

文章目錄 一. 為什么要劃分數據集二. 數據集劃分的方法1. 留出法&#xff1a;2. 交叉驗證&#xff1a;將數據集劃分為訓練集&#xff0c;驗證集&#xff0c;測試集3. 留一法&#xff1a;4. 自助法&#xff1a; 一. 為什么要劃分數據集 為了能夠評估模型的泛化能力&#xff0c;可…

根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的Spotify音樂 附python代碼

這段代碼是一個Python腳本,它使用了幾個外部庫來創建一個簡單的圖形用戶界面(GUI),讓用戶根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的音樂。 1. **導入庫**: - `openai`:用于與OpenAI API交互(盡管在這段代碼中沒有使用)。 - `sp…

excel導入數據處理前端

dialogErrorVisible false;dialogErrorTitle ;//錯誤標題public get gridErrorOptions(): GridOptions {return {headerHeight: 30, // 表頭高度rowHeight: 30, // 行高columnDefs: [//列定義{headerName: "序號",field: "SerialNumber",width: 40,pinne…