Spring Boot(8)深入理解 @Autowired 注解:使用場景與實戰示例

搞個引言

在 Spring 框架的開發中,依賴注入(Dependency Injection,簡稱 DI)是它的一個核心特性,它能夠讓代碼更加模塊化、可測試,并且易于維護。而 @Autowired 注解作為 Spring 實現依賴注入的關鍵工具,給咱們開發者提供了極大的便利。本文將通過具體的示例詳細介紹 @Autowired 注解的多種使用場景,幫助你更好地掌握這一重要注解~

一、構造函數注入

1.1 基本原理

當一個類依賴于其他 Bean 時,使用 @Autowired 注解在構造函數上進行依賴注入是一種推薦的方式。這種方式能保證對象在創建時其依賴項就已經被正確初始化,符合依賴項不變性原則。也就是說,對象一旦創建完成,其依賴的 Bean 就不會再改變了。

1.2 示例代碼

// 定義一個服務接口
interface UserService {void saveUser();
}// 實現服務接口
class UserServiceImpl implements UserService {@Overridepublic void saveUser() {System.out.println("User saved.");}
}// 定義一個控制器類,依賴 UserService
class UserController {private final UserService userService;// 使用 @Autowired 注解在構造函數上進行依賴注入@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public void handleSaveUser() {userService.saveUser();}
}

1.3 代碼解釋

在上述代碼中,UserController 類依賴于 UserService 接口的實現類。通過在構造函數上使用 @Autowired 注解,Spring 容器會自動查找 UserService 類型的 Bean,并將其注入到 UserController 的構造函數中。這樣,在創建 UserController 對象時,userService 字段就已經被正確初始化,后續可以直接使用。

1.4 使用優勢

  • 依賴不可變:使用構造函數注入,一旦對象創建完成,其依賴的 Bean 就不會再改變,保證了對象狀態的一致性。
  • 便于單元測試:在進行單元測試時,可以方便地通過構造函數傳入模擬對象,提高代碼的可測試性。

二、Setter 方法注入

2.1 基本原理

除了構造函數注入,@Autowired 注解還可以用于 Setter 方法上。這種方式允許在對象創建后動態地注入依賴項,適用于一些依賴項可能會在對象生命周期內發生變化的場景。

2.2 示例代碼

// 定義一個郵件服務接口
interface EmailService {void sendEmail(String message);
}// 實現郵件服務接口
class EmailServiceImpl implements EmailService {@Overridepublic void sendEmail(String message) {System.out.println("Sending email: " + message);}
}// 定義一個通知服務類,依賴 EmailService
class NotificationService {private EmailService emailService;// 使用 @Autowired 注解在 Setter 方法上進行依賴注入@Autowiredpublic void setEmailService(EmailService emailService) {this.emailService = emailService;}public void sendNotification(String message) {emailService.sendEmail(message);}
}

2.3 代碼解釋

在這個示例中,NotificationService 類依賴于 EmailService。通過在 setEmailService 方法上使用 @Autowired 注解,Spring 容器會自動查找 EmailService 類型的 Bean,并調用該 Setter 方法將其注入到 NotificationService 對象中。

2.4 使用優勢

  • 靈活性高:可以在對象創建后動態地改變依賴項,適應不同的業務需求。
  • 部分依賴注入:當一個類有多個依賴項,但不是所有依賴項都需要在對象創建時立即注入時,使用 Setter 方法注入可以更靈活地管理依賴。

三、字段注入

3.1 基本原理

@Autowired 注解還可以直接用于類的字段上,這是一種最簡單的依賴注入方式。Spring 容器會自動查找匹配類型的 Bean,并將其注入到相應的字段中。

3.2 示例代碼

// 定義一個日志服務接口
interface LogService {void log(String message);
}// 實現日志服務接口
class LogServiceImpl implements LogService {@Overridepublic void log(String message) {System.out.println("Logging: " + message);}
}// 定義一個業務服務類,依賴 LogService
class BusinessService {// 使用 @Autowired 注解在字段上進行依賴注入@Autowiredprivate LogService logService;public void doBusiness() {logService.log("Business operation started.");// 業務邏輯代碼logService.log("Business operation completed.");}
}

3.3 代碼解釋

BusinessService 類中,logService 字段使用了 @Autowired 注解。Spring 容器會自動查找 LogService 類型的 Bean,并將其注入到該字段中。這樣,在 doBusiness 方法中就可以直接使用 logService 進行日志記錄。

3.4 使用優勢

  • 代碼簡潔:無需編寫構造函數或 Setter 方法,代碼更加簡潔明了。

3.5 使用注意事項

  • 不利于單元測試:由于字段注入是通過反射實現的,在進行單元測試時,難以直接注入模擬對象,降低了代碼的可測試性。
  • 依賴不明確:字段注入隱藏了類的依賴關系,不利于代碼的維護和理解。

四、數組和集合注入

4.1 基本原理

@Autowired 注解不僅可以注入單個 Bean,還可以注入數組或集合類型的 Bean。Spring 容器會自動查找所有匹配類型的 Bean,并將它們注入到相應的數組或集合中。

4.2 示例代碼

// 定義一個消息處理器接口
interface MessageHandler {void handleMessage(String message);
}// 實現消息處理器接口
class EmailMessageHandler implements MessageHandler {@Overridepublic void handleMessage(String message) {System.out.println("Handling email message: " + message);}
}class SmsMessageHandler implements MessageHandler {@Overridepublic void handleMessage(String message) {System.out.println("Handling SMS message: " + message);}
}// 定義一個消息分發服務類,依賴多個 MessageHandler
class MessageDispatcherService {// 使用 @Autowired 注解注入 MessageHandler 數組@Autowiredprivate MessageHandler[] messageHandlers;public void dispatchMessage(String message) {for (MessageHandler handler : messageHandlers) {handler.handleMessage(message);}}
}

3.3 代碼解釋

MessageDispatcherService 類中,messageHandlers 字段是一個 MessageHandler 數組,使用 @Autowired 注解進行注入。Spring 容器會自動查找所有實現了 MessageHandler 接口的 Bean,并將它們注入到該數組中。在 dispatchMessage 方法中,可以遍歷數組并調用每個 MessageHandlerhandleMessage 方法。

3.4 使用優勢

  • 方便管理多個同類型 Bean:當一個類需要依賴多個同類型的 Bean 時,使用數組或集合注入可以方便地管理這些 Bean。

五、總結

@Autowired 注解為 Spring 框架中的依賴注入提供了多種靈活的方式,包括構造函數注入、Setter 方法注入、字段注入以及數組和集合注入。在實際開發中,應根據具體的業務場景和需求選擇合適的注入方式。構造函數注入適用于依賴項不變的場景,能提高代碼的可測試性;Setter 方法注入提供了更高的靈活性,適用于依賴項可能動態變化的情況;字段注入雖然代碼簡潔,但不利于單元測試和代碼維護;數組和集合注入則方便管理多個同類型的 Bean。通過合理使用 @Autowired 注解,可以讓代碼更加模塊化、可維護和易于測試。

?結尾

🀙🀚🀛🀜🀝🀞🀟🀠🀡🀐🀑🀒🀓🀔🀕🀖🀘🀗🀏🀎🀍🀌🀋🀊🀉🀈🀇🀆🀅🀃🀂🀁🀀🀄?🀢🀣🀥🀤🀦🀧🀨🀩🀪

📘 妹妹聽后點了點頭,臉上露出了滿意的笑容。她輕聲說道:“原來如此,謝謝你,鴿鴿。看來我不僅要多讀書,還要多動手實踐,提升自己才行。”

看著她那充滿求知欲的眼神,我不禁感嘆,學習之路雖然充滿挑戰,但有這樣一位美麗聰慧的伙伴相伴,一切都變得格外有意義。快去和妹妹一起實踐一下吧!

求贊圖

📘相關閱讀??

筆者 綦楓Maple 的其他作品,歡迎點擊查閱哦~:
📚Jmeter性能測試大全:Jmeter性能測試大全系列教程!持續更新中!
📚UI自動化測試系列: Selenium+Java自動化測試系列教程?
📚移動端自動化測試系列:Appium自動化測試系列教程
📚Postman系列:Postman高級使用技巧系列


👨?🎓作者:綦楓Maple
🚀博客:CSDN、掘金等
🚀CSDN技術社區:https://bbs.csdn.net/forums/testbean
🚀網易云音樂:https://y.music.163.com/m/user?id=316706413
🚫特別聲明:原創不易,轉載請附上原文出處鏈接和本文聲明,謝謝配合。
🙏版權聲明:文章里可能部分文字或者圖片來源于互聯網或者百度百科,如有侵權請聯系處理。
🀐其他:若有興趣,可以加文章結尾的Q群,一起探討學習哦~

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

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

相關文章

DeepSeek教unity------Dotween

1、命名法 Tweener(補間器):一種控制某個值并對其進行動畫處理的補間。 Sequence(序列):一種特殊的補間,它不直接控制某個值,而是控制其他補間并將它們作為一個組進行動畫處理。 Tw…

【JAVA實戰】JAVA實現Excel模板下載并填充模板下拉選項數據

背景 有這樣一個場景:前端下載Excel模板,進行數據導入,這個下載模板過程需要經過后端接口去數據庫查詢數據進行某些列的下拉數據填充,下拉填充的數據過程中會出現錯誤String literals in formulas can’t be bigger than 255 cha…

【深度學習】計算機視覺(CV)-目標檢測-DETR(DEtection TRansformer)—— 基于 Transformer 的端到端目標檢測

1.什么是 DETR? DETR(DEtection TRansformer) 是 Facebook AI(FAIR)于 2020 年提出的 端到端目標檢測算法,它基于 Transformer 架構,消除了 Faster R-CNN、YOLO 等方法中的 候選框(…

IDEA + 通義靈碼AI程序員:快速構建DDD后端工程模板

作者:陳榮健 IDEA 通義靈碼AI程序員:快速構建DDD后端工程模板 在軟件開發過程中,一個清晰、可維護、可擴展的架構至關重要。領域驅動設計 (DDD) 是一種軟件開發方法,它強調將軟件模型與業務領域緊密結合,從而構建更…

責任鏈模式原理詳解和源碼實例以及Spring AOP攔截器鏈的執行源碼如何使用責任鏈模式?

前言 本文首先介紹了責任鏈的基本原理,并附帶一個例子說明責任鏈模式,確保能夠理解責任鏈的前提下,在進行Spring AOP執行責任鏈的源碼分析。責任鏈模式允許將多個處理對象連接成鏈,請求沿著鏈傳遞,直到被處理或結束。每…

React 與 Vue 對比指南 - 上

React 與 Vue 對比指南 - 上 本文將展示如何在 React 和 Vue 中實現常見功能&#xff0c;從基礎渲染到高級狀態管理 Hello 分別使用 react 和 vue 寫一個 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…

大模型開發實戰篇7:語音識別-語音轉文字

語音識別大模型&#xff0c;是人工智能領域的一項重要技術&#xff0c;它能夠將人類的語音轉換為文本。近年來&#xff0c;隨著深度學習技術的不斷發展&#xff0c;語音識別大模型取得了顯著的進展&#xff0c;并在各個領域得到了廣泛應用。 主流語音識別大模型 目前&#xf…

向量的點乘的幾何意義

源自AI 向量的點乘&#xff08;Dot Product&#xff09;在幾何和圖形學中有重要的意義。它不僅是數學運算&#xff0c;還可以用來描述向量之間的關系。以下是點乘的幾何意義及其應用&#xff1a; 1. 點乘的定義 對于兩個向量 a 和 b&#xff0c;它們的點乘定義為&#xff1a;…

國產芯片汽車氣壓表pcba方案

汽車氣壓表的基本原理是利用氣壓傳感器將氣體氣壓轉換為電信號&#xff0c;再通過電子芯片電路進行處理傳輸&#xff0c;再將這些信息轉發給顯示屏顯示。常見的傳感器包括模擬氣壓傳感器和數字氣壓傳感器。其中&#xff0c;模擬氣壓傳感器是目前應用最廣泛的傳感器之一&#xf…

解鎖機器學習核心算法 | K -近鄰算法:機器學習的神奇鑰匙

一、引言 今天我們繼續學習機器學習核心算法 —— K - 近鄰&#xff08;K-Nearest Neighbors&#xff0c;簡稱 KNN&#xff09;算法。它就像是一位經驗豐富的 “老江湖”&#xff0c;以其簡單而又強大的方式&#xff0c;在眾多機器學習任務中占據著不可或缺的地位。 K - 近鄰…

如何在Windows 10操作系統中安裝并配置PHP集成軟件XAMPP

步驟1&#xff1a;下載XAMPP安裝包 訪問XAMPP官網&#xff1a; 打開瀏覽器&#xff0c;進入XAMPP官方網站&#xff1a;https://www.apachefriends.org/index.html 選擇XAMPP版本&#xff1a; 在XAMPP的下載頁面上&#xff0c;選擇適合Windows的最新穩定版本下載&#xff08;例…

【DeepSeek】本地部署,保姆級教程

deepseek網站鏈接傳送門&#xff1a;DeepSeek 在這里主要介紹DeepSeek的兩種部署方法&#xff0c;一種是調用API&#xff0c;一種是本地部署。 一、API調用 1.進入網址Cherry Studio - 全能的AI助手選擇立即下載 2.安裝時位置建議放在其他盤&#xff0c;不要放c盤 3.進入軟件后…

Python 入門教程(2)搭建環境 | 2.3、VSCode配置Python開發環境

文章目錄 一、VSCode配置Python開發環境1、軟件安裝2、安裝Python插件3、配置Python環境4、包管理5、調試程序 前言 Visual Studio Code&#xff08;簡稱VSCode&#xff09;以其強大的功能和靈活的擴展性&#xff0c;成為了許多開發者的首選。本文將詳細介紹如何在VSCode中配置…

Oracle EBS 12.1和APEX 集成時 Apache的配置代理

在有些場景下&#xff0c;apex的前端服務不是和oracle EBS 應用部署在同一個服務器上或者要求apex和訪問地址和EBS公用同一個域名同一個端口&#xff0c;那么怎么才能做到用EBS 的域名和端口來實現對apex的訪問呢 通過配置代理規則解決&#xff0c;以Oracle EBS 12.1.3 為例&am…

【第二節】C++設計模式(創建型模式)-抽象工廠模式

目錄 引言 一、抽象工廠模式概述 二、抽象工廠模式的應用 三、抽象工廠模式的適用場景 四、抽象工廠模式的優缺點 五、總結 引言 抽象工廠設計模式是一種創建型設計模式&#xff0c;旨在解決一系列相互依賴對象的創建問題。它與工廠方法模式密切相關&#xff0c;但在應用…

ubuntu20.04重啟后不顯示共享文件夾

ubuntu20.04重啟后不顯示共享文件夾 主要參見這兩篇博客 Ubuntu重啟后不顯示共享文件夾_ubuntu 20.04 共享目錄無法使用-CSDN博客 ubuntu22.04 配置共享文件夾 找不到/mnt/hgfs_ubuntu安裝tools 后mnt文件夾在哪-CSDN博客 重啟Ubuntu20.04后&#xff0c;發現共享文件夾進不去…

halcon機器視覺深度學習對象檢測,物體檢測

目錄 效果圖操作步驟軟件版本halcon參考代碼本地函數 get_distinct_colors()本地函數 make_neighboring_colors_distinguishable() 效果圖 操作步驟 首先要在Deep Learning Tool工具里面把圖片打上標注文本&#xff0c; 然后訓練模型&#xff0c;導出模型文件 這個是模型 mod…

9.PG數據庫層權限管理(pg系列課程)第2遍

一、PostgreSQL數據庫屬主 Postgres中的數據庫屬主屬于創建者&#xff0c;只要有createdb的權限就可以創建數據庫&#xff0c;數據庫屬主不一定擁有存放在該數據庫中其它用戶創建的對象的訪問權限。數據庫在創建后&#xff0c;允許public角色連接&#xff0c;即允許任何人連接…

2.19學習(php文件后綴)

misc buu-后門查殺 下載附件&#xff0c;我們用火絨安全掃一下然后點擊詳情進入該文件所在文件夾&#xff0c;再用記事本打開該文件&#xff0c;搜索flag無果&#xff0c;再試試pass&#xff08;由題目中的密碼聯系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

PMBOK第7版整體架構全面詳解

1. 引言 7月1日對于項目管理從業者和研究者而言&#xff0c;是個非凡意義的一個時間&#xff0c;這一天&#xff0c;翹首以待的《 項 目管理知識體系指南 》&#xff08;PMBOK&#xff09;第七版終于發布了。 總體而言&#xff0c;PMBOK第七版集百家之所長&#xff0c;成一…