Spring Boot 中 @Bean 注解詳解:從入門到實踐

在 Spring Boot 開發中,@Bean注解是一個非常重要且常用的注解,它能夠幫助開發者輕松地將 Java 對象納入 Spring 容器的管理之下,實現對象的依賴注入和生命周期管理。對于新手來說,理解并掌握@Bean注解,是深入學習 Spring Boot 開發的必經之路。

接下來,我們就來詳細了解一下這個注解。

一、@Bean 注解的基本概念?

@Bean注解是 Spring 框架提供的用于定義 Bean 的方式之一,它可以用在方法上,告訴 Spring 容器,這個方法返回的對象應該被注冊為一個 Bean,納入 Spring 容器的管理。

簡單來說,通過@Bean注解標記的方法,就像是一個 “工廠方法”,負責創建并返回特定的 Java 對象實例,然后 Spring 容器會對這些實例進行管理,比如控制它們的創建時機、生命周期等。?

二、@Bean 注解的使用場景?

1.在配置類中定義 Bean?

在 Spring Boot 中,我們通常會創建一個配置類,使用@Configuration注解標記,在這個配置類中可以定義多個@Bean方法。下面通過一個簡單的示例來演示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {// 定義一個名為myService的Bean@Beanpublic MyService myService() {return new MyService();}
}class MyService {public void doSomething() {System.out.println("MyService is doing something.");}
}

在上述代碼中,AppConfig是一個配置類,通過@Configuration注解聲明。在該類中,myService方法使用@Bean注解標記,它返回一個MyService的實例。這樣,Spring 容器在啟動時,就會調用這個方法創建MyService實例,并將其注冊為一個 Bean,其他需要使用MyService的組件就可以通過依賴注入的方式獲取這個實例。?

2.傳遞方法參數?

@Bean方法也可以接收參數,Spring 容器會自動將容器中匹配的 Bean 作為參數傳入。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {// 這里簡單模擬創建數據源return new DataSource();}@Beanpublic MyRepository myRepository(DataSource dataSource) {return new MyRepository(dataSource);}
}class DataSource {// 數據源相關代碼
}class MyRepository {private DataSource dataSource;public MyRepository(DataSource dataSource) {this.dataSource = dataSource;}// 數據訪問相關代碼
}

在這個例子中,myRepository方法依賴于dataSource Bean。Spring 容器在創建myRepository Bean 時,會自動查找容器中類型為DataSource的 Bean,并將其作為參數傳入myRepository方法,從而實現了 Bean 之間的依賴關系。?

3.設置 Bean 的作用域?

通過@Bean注解還可以設置 Bean 的作用域,默認情況下,Bean 的作用域是單例(Singleton),即整個應用程序中只有一個實例。但我們也可以通過@Scope注解來改變 Bean 的作用域。例如,將 Bean 的作用域設置為原型(Prototype),每次請求都會創建一個新的實例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class AppConfig {@Bean@Scope("prototype")public MyService myService() {return new MyService();}
}

在上述代碼中,@Scope("prototype")注解將myService Bean 的作用域設置為原型,這樣每次從 Spring 容器中獲取myService實例時,都會得到一個新創建的對象。?

三、@Bean 注解與其他相關注解的關系?

1.@Bean 與 @Component 系列注解的區別?

@Component、@Service、@Repository、@Controller等注解也是用于將類納入 Spring 容器管理的,但它們是用在類上,通過類路徑掃描的方式自動發現并注冊 Bean。

而@Bean注解是用在方法上,需要顯式地在配置類中定義 Bean。?

例如,對于一個服務類,可以使用@Service注解:

import org.springframework.stereotype.Service;@Service
public class MyService {public void doSomething() {System.out.println("MyService is doing something.");}
}

Spring 容器會自動掃描到帶有@Service注解的類,并將其實例注冊為 Bean。而使用@Bean則需要在配置類中定義方法來創建實例。?

2.@Bean 與 @Autowired 的配合使用?

@Autowired注解用于實現 Bean 的依賴注入,它可以將 Spring 容器中管理的 Bean 自動注入到需要使用的地方。通常情況下,@Bean注解創建的 Bean 和@Autowired注解配合使用,來實現組件之間的依賴關系。?

例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyComponent {private MyService myService;@Autowiredpublic MyComponent(MyService myService) {this.myService = myService;}public void doWork() {myService.doSomething();}
}

在上述代碼中,MyComponent類通過構造函數注入的方式,將MyService Bean 注入進來。MyService Bean 就是通過@Bean注解在配置類中定義的。?

四、總結?

@Bean注解是 Spring Boot 中定義 Bean 的重要方式,它具有高度的靈活性和擴展性。

通過@Bean注解,我們可以在配置類中顯式地創建 Bean 實例,控制 Bean 之間的依賴關系,設置 Bean 的作用域等。

同時,它與@Component系列注解、@Autowired注解等相互配合,共同構建了 Spring 強大的依賴注入和 Bean 管理體系。作為新手,熟練掌握@Bean注解的使用,對于開發高效、可維護的 Spring Boot 應用程序至關重要。在實際開發過程中,我們可以根據具體的業務需求,靈活運用@Bean注解,充分發揮 Spring 框架的優勢。?

上述內容從多方面介紹了@Bean注解。若你對文中代碼示例、某些概念還有疑問,或想了解更多相關知識,歡迎隨時告訴我。

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

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

相關文章

TCP 協議設計入門:自定義消息格式與粘包解決方案

目錄 一、為什么需要自定義 TCP 協議? TCP粘包問題的本質 1.1 粘包與拆包的定義 1.2 粘包的根本原因 1.3 粘包的典型場景 二、自定義消息格式設計 2.1 協議結構設計 方案1:固定長度協議 方案2:分隔符標記法 方案3:長度前…

了解一下OceanBase中的表分區

OceanBase 是一個高性能的分布式關系型數據庫,它支持 SQL 標準的大部分功能,包括分區表。分區表可以幫助管理大量數據,提高查詢效率,通過將數據分散到不同的物理段中,可以減少查詢時的數據掃描量。 在 OceanBase 中操…

多線程網絡編程:粘包問題、多線程/多進程服務器實戰與常見問題解析

多線程網絡編程:粘包問題、多線程/多進程服務器實戰與常見問題解析 一、TCP粘包問題:成因、影響與解決方案 1. 粘包問題本質 TCP是面向流的協議,數據傳輸時沒有明確的消息邊界,導致多個消息可能被合并(粘包&#xf…

大模型主干

1.什么是語言模型骨架LLM-Backbone,在多模態模型中的作用? 語言模型骨架(LLM Backbone)是多模態模型中的核心組件之一。它利用預訓練的語言模型(如Flan-T5、ChatGLM、UL2等)來處理各種模態的特征,進行語義…

[創業之路-350]:光刻機、激光器、自動駕駛、具身智能:跨學科技術體系全景解析(光-機-電-材-熱-信-控-軟-網-算-智)

光刻機、激光器、自動駕駛、具身智能四大領域的技術突破均依賴光、機、電、材、熱、信、控、軟、網、算、智十一大學科體系的深度耦合。以下從技術原理、跨學科融合、關鍵挑戰三個維度展開系統性分析: 一、光刻機:精密制造的極限挑戰 1. 核心技術與學科…

SVTAV1 編碼函數 svt_aom_is_pic_skipped

一 函數解釋 1.1 svt_aom_is_pic_skipped函數的作用是判斷當前圖片是否可以跳過編碼處理。 具體分析如下 函數邏輯 參數說明:函數接收一個指向圖片父控制集的指針PictureParentControlSet *pcs, 通過這個指針可以獲取與圖片相關的各種信息,用于判斷是否跳…

【Redis新手入門指南】從小白入門到日常使用(全)

文章目錄 前言redis是什么?定義原理與特點與MySQL對比 Redis安裝方式一、Homebrew 快速安裝 Redis(推薦)方式二、源碼編譯安裝redisHomebrew vs 源碼安裝對比 redis配置說明修改redis配置的方法常見redis配置項說明 redis常用命令redis服務啟…

Linux grep 命令詳解及示例大全

文章目錄 一、基本語法二、常用選項及示例1. 基本匹配:查找包含某字符串的行2. 忽略大小寫匹配 -i3. 顯示行號 -n4. 遞歸查找目錄下的文件 -r 或 -R5. 僅顯示匹配的字符串 -o6. 使用正則表達式 -E(擴展)或 egrep7. 顯示匹配前后行 -A, -B, -C…

【排序算法】快速排序(全坤式超詳解)———有這一篇就夠啦

【排序算法】——快速排序 目錄 一:快速排序——思想 二:快速排序——分析 三:快速排序——動態演示圖 四:快速排序——單趟排序 4.1:霍爾法 4.2:挖坑法 4.3:前后指針法 五:…

【platform push 提示 Invalid source ref: HEAD】

platform push 提示 Invalid source ref: HEAD 場景:環境:排查過程:解決: 場景: 使用platform push 命令行輸入git -v 可以輸出git 版本號,但就是提示Invalid source ref: HEAD,platform creat…

x-cmd install | Tuistash - Logstash 實時監控,告別圖形界面,高效便捷!

目錄 核心優勢,一覽無遺安裝適用場景,廣泛覆蓋功能亮點,不容錯過 還在為 Logstash 的監控而頭疼嗎?還在頻繁切換圖形界面查看數據嗎?現在,有了 Tuistash,一切都將變得簡單高效! Tui…

【JEECG】BasicTable單元格編輯,插槽添加下拉組件樣式錯位

1.功能說明 BasicTable表格利用插槽&#xff0c;添加組件實現單元格編輯功能&#xff0c;選擇組件下拉框錯位 2.效果展示 3.解決方案 插槽內組件增加&#xff1a;:getPopupContainer"getPopupContainer" <template #salesOrderProductStatus"{ column, re…

論文閱讀筆記——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors

RoboGround 論文 一類中間表征是語言指令&#xff0c;但對于空間位置描述過于模糊&#xff08;“把杯子放桌上”但不知道放桌上哪里&#xff09;&#xff1b;另一類是目標圖像或點流&#xff0c;但是開銷大&#xff1b;由此 GeoDEX 提出一種兼具二者的掩碼。 相比于 GR-1&#…

K8S的使用(部署pod\service)+安裝kubesphere圖形化界面使用和操作

master節點中通過命令部署一個tomcat 查看tomcat被部署到哪個節點上 在節點3中進行查看 在節點3中進行停止容器&#xff0c;K8S會重新拉起一個服務 如果直接停用節點3&#xff08;模擬服務器宕機&#xff09;&#xff0c;則K8S會重新在節點2中拉起一個服務 暴露tomcat訪…

紛析云開源財務軟件:重新定義企業財務自主權

痛點直擊&#xff1a;傳統財務管理的三大桎梏 “黑盒”困局 閉源商業軟件代碼不可見&#xff0c;企業無法自主調整功能&#xff0c;政策變化或業務升級依賴廠商排期&#xff0c;響應滯后。 數據托管于第三方平臺&#xff0c;存在泄露風險&#xff0c;合規審計被動受限。 成本…

mybatis 的多表查詢

文章目錄 多表查詢一對一一對多 多表查詢 一對一 開啟代碼片段編寫 專注于 SQL的 編寫 JDBC 的寫法&#xff0c;注重于 SQL mybatis 在 一對一查詢時&#xff0c;核心在于 建立每個表對應的實體類主鍵根據 主鍵 id 進行查詢&#xff0c;副標根據 設定外鍵進行查詢 在 SQL編寫…

Scrapy爬蟲實戰:如何用Rules實現高效數據采集

Scrapy是一個強大的Python爬蟲框架&#xff0c;而其中的Rules類則為爬蟲提供了更高級的控制方式。本文將詳細介紹如何在Scrapy中使用Rules&#xff0c;以及各個參數的具體作用&#xff0c;并結合實際場景說明Rules的必要性。 為什么需要Rules&#xff1f; 在Web爬取過程中&…

ActiveMQ 性能優化與網絡配置實戰(一)

一、引言 在當今分布式系統和微服務架構盛行的時代&#xff0c;消息中間件作為實現系統間異步通信、解耦和削峰填谷的關鍵組件&#xff0c;其重要性不言而喻。ActiveMQ 作為一款廣泛應用的開源消息中間件&#xff0c;憑借其對多種消息協議的支持、靈活的部署方式以及豐富的功能…

免費視頻壓縮軟件

一、本地軟件&#xff08;支持離線使用&#xff09; 1. HandBrake 平臺&#xff1a;Windows / macOS / Linux 特點&#xff1a;開源免費&#xff0c;支持多種格式轉換&#xff0c;提供豐富的預設選項&#xff08;如“Fast 1080p”快速壓縮&#xff09;&#xff0c;可自定義分…

消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘報錯輸出的記錄

#工作記錄 嘗試消除 消除“模塊ttsfrd沒有屬性ttsfrontendengine”的錯誤的記錄 報錯摘錄&#xff1a; Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…