@component、@bean、@Configuration的區別

詳細解析Spring框架中這三個最核心、也最容易混淆的注解:@Component@Bean@Configuration

為了快速理解,我們先看一個總結性的表格:

注解應用級別作用使用場景
@Component級別將類標識為Spring組件,讓Spring自動掃描并創建實例(Bean)。標記我們自己編寫的類,如Service、Repository、Controller等。
@Bean方法級別聲明一個Bean。告訴Spring執行這個方法,并將返回的對象注冊為Bean。注冊第三方庫的類或需要復雜初始化邏輯的類。
@Configuration級別聲明一個配置類,作為@Bean方法定義的容器。專門用于組織和定義Bean的配置類。

下面我們用一個“自己動手組裝電腦”的比喻來深入解釋。

  • @Component標準化的流水線零件。比如CPU、內存條、顯卡。這些零件都是按照標準生產的,工廠(Spring)的自動化掃描系統(@ComponentScan)只要看到圖紙(類),就能自動生產并放到倉庫(Spring容器)里備用。
  • @Bean定制化的組裝說明書。比如,你想組裝一個帶RGB燈效的水冷散熱系統。這需要多個步驟和零件,不能自動完成。你得寫一份詳細的說明書(方法),告訴工廠(Spring)如何一步步操作,最終組裝出這個成品(Bean)。
  • @Configuration存放所有“定制說明書”的檔案室。這個房間(類)本身也是工廠的一部分,專門用來存放各種@Bean說明書。工廠會優先查看這個檔案室,按照里面的說明書來完成定制零件的組裝。

1. @Component:類的“身份證”

@Component是最通用的一個注解,它的作用就是告訴Spring:“請注意,這個類是我的一個組件,請你掃描到它,并為我創建一個實例(Bean)放入容器中進行管理。

  • 如何工作:Spring通過**組件掃描(@ComponentScan)**機制,在啟動時會自動查找所有被@Component及其衍生注解標記的類,并為它們創建對象。
  • 衍生注解:為了讓組件的職責更清晰,Spring提供了三個@Component的“特化版”注解:
    • @Service:用在業務邏輯層(Service層)。
    • @Repository:用在數據訪問層(DAO/Repository層),還能提供額外的異常轉譯功能。
    • @Controller / @RestController:用在Web控制層。
      在功能上,這四個注解幾乎是等價的,但使用更具體的注解能讓代碼的意圖更加明確。

使用場景用于標注你自己編寫的類。當你希望Spring自動管理你寫的Service、DAO等類時,就用它。

代碼示例:

@Service // @Service本質上就是一個@Component
public class UserServiceImpl implements UserService {public void sayHello() {System.out.println("Hello from UserService!");}
}

你只需要在類上加一個注解,Spring就會自動幫你new UserServiceImpl()并管理起來。


2. @Bean:方法的“生產指令”

@Bean的作用是告訴Spring:“請執行這個方法,方法返回的那個對象,就是我想要你幫我管理的Bean。

  • 如何工作@Bean注解必須用在方法上,并且這個方法通常定義在一個被@Configuration標記的類中。Spring會調用這個方法,并將返回的對象注冊到容器中。Bean的名稱默認就是方法名。
  • 核心優勢:它給了你完全的控制權來創建和配置Bean。

使用場景

  1. 注冊第三方庫的Bean:你想使用一個來自第三方庫的類(比如RestTemplateDataSourceObjectMapper等),你無法修改它的源碼去添加@Component注解。這時,你可以在你自己的配置類中寫一個方法來創建它的實例,并用@Bean標記。
  2. 復雜的初始化邏輯:當一個對象的創建過程很復雜,需要在構造函數之外執行很多配置和初始化步驟時,可以把這些邏輯都封裝在一個@Bean方法里。

代碼示例:

@Configuration
public class AppConfig {// 我無法修改RestTemplate的源碼,所以用@Bean來注冊它@Beanpublic RestTemplate restTemplate() {// 在這里可以進行復雜的配置,比如設置超時時間、攔截器等return new RestTemplate();}
}

3. @Configuration:Bean定義的“大本營”

@Configuration的作用是告訴Spring:“這個類是一個配置中心,里面定義了很多Bean的創建信息(即包含了很多@Bean方法),請優先處理我。

  • 如何工作@Configuration本身也是一個@Component,所以它能被組件掃描發現。它的核心職責是作為@Bean方法的容器。
  • 一個關鍵的“黑魔法”@Configuration比普通的@Component多一個重要特性。被@Configuration注解的類會被Spring通過CGLIB動態代理來增強。這個增強的目的是為了解決Bean之間的依賴調用問題

@Configuration的“黑魔法”解釋:

假設我們有兩個Bean,beanB依賴beanA

@Configuration
public class MyConfig {@Beanpublic BeanA beanA() {return new BeanA();}@Beanpublic BeanB beanB() {// 在這里,我們調用了beanA()方法return new BeanB(beanA()); }
}
  • 如果用@Configuration:當調用beanB()方法時,其中的beanA()方法調用不會真的去執行new BeanA()。CGLIB代理會攔截這個調用,檢查容器里是否已經存在名為beanA的Bean。如果存在,就直接返回容器里的那個單例實例;如果不存在,才執行方法體創建并注冊,然后返回。這保證了無論beanA()被調用多少次,返回的都是同一個單例對象。

  • 如果用@Component替換@Configuration@Bean@Component類中也能工作(稱為“Lite模式”),但此時沒有CGLIB代理增強。當調用beanB()時,其中的beanA()就是一個普通的Java方法調用,它會每次都new BeanA(),從而破壞了Bean的單例性。

總結:何時用什么?

  • 規則1:用@Component來標注你自己的類。讓Spring自動發現和管理它們,這是最常規、最推薦的做法。
  • 規則2:用@Bean@Configuration來處理“外部世界”。當你需要將第三方庫的組件整合到Spring中,或者需要非常精細地控制Bean的創建過程時,就使用這種組合。

簡單來說,@Component自動化配置的體現,而@Bean精細化、顯式化配置的體現。兩者相輔相成,共同構成了Spring強大的依賴注入能力。

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

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

相關文章

Android多媒體——音/視同步數據處理(二十)

在多媒體播放過程中,音頻數據的處理不僅要保證其解碼和輸出的連續性,還需要與視頻幀保持時間上的嚴格對齊,以實現良好的觀看體驗。Android 多媒體框架中的 NuPlayerRenderer 是負責最終渲染音視頻數據的核心組件之一。 一、Audio數據處理 NuPlayerRenderer 是 Android 原生…

MYSQL 使用命令mysqldump備份數據庫的時候需要用戶具備什么權限

背景 之前都是使用數據庫root用戶備份數據庫,沒有權限問題,今天使用一個數據庫基本用戶備份數據庫,提示一直沒有權限,提示的很明顯 mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for …

WebRTC源碼線程-1

1、概述 本篇主要是簡單介紹WebRTC中的線程,WebRTC源碼對線程做了很多的封裝。 1.1 WebRTC中線程的種類 1.1.1 信令線程 用于與應用層的交互,比如創建offer,answer,candidate等絕大多數的操作 1.1.2 工作線程 負責內部的處理邏輯&…

spring:使用標簽xml靜態工廠方法獲取bean

在spring可以直接通過配置文件獲取bean對象,如果獲取的bean對象還有若干設置,需要自動完成,可以通過工廠方法獲取bean對象。 靜態工廠類,其中InterfaceUserDao和InterfaceUserService都是自定義的接口,可以自己替換。…

linux 用戶態時間性能優化工具perf/strace/gdb/varlind/gprof

1. perf top -g或者top分析卡頓(cpu占用比較高的函數) gdb 是 GNU 調試器,可以用于分析程序的時間性能。雖然 info time 不是直接用于性能分析的命令,但 gdb 提供了與時間相關的功能,例如通過 timer 命令設置計時器或通過 info proc 查看進程的時間信息。 #include <…

客戶端和服務器已成功建立 TCP 連接【輸出解析】

文章目錄 圖片**1. 連接狀態解析****第一條記錄&#xff08;服務器監聽&#xff09;****第二條記錄&#xff08;客戶端 → 服務器&#xff09;****第三條記錄&#xff08;服務器 → 客戶端&#xff09;** **2. 關鍵概念澄清****(1) 0.0.0.0 的含義****(2) 端口號的分配規則** *…

Win系統下的Linux系統——WSL 使用手冊

我們在復現一些項目的時候&#xff0c;有些依賴包只能在 linux 環境下使用&#xff0c;還不打算使用遠程服務器&#xff0c;那么此時我們可以使用 WSL 創建一個 ubutu 系統&#xff0c;在這個系統里創建虛擬環境、下載依賴包。然后&#xff0c;我們就可以在 windows 下的 vscod…

電腦同時連接內網和外網的方法,附外網連接局域網的操作設置

對于工作一般都設置在內網網段中&#xff0c;而同時由于需求需要連接外網&#xff0c;一般只能通過內網和外網的不斷切換進行設置&#xff0c;如果可以同時連接內網和外網會更加便利&#xff0c;同時連接內網和外網方法具體如下。 一、電腦怎么弄可以同時連接內網和外網&#…

C++11:原子操作與內存順序:從理論到實踐的無鎖并發實現

文章目錄 0.簡介1.并發編程需要保證的特性2.原子操作2.1 原子操作的特性 3.內存順序3.1 順序一致性3.2 釋放-獲取&#xff08;Release-Acquire)3.3 寬松順序&#xff08;Relaxed)3.4 內存順序 4.無鎖并發5. 使用建議 0.簡介 在并發編程中&#xff0c;原子性、可見性和有序性是…

oracle 歸檔日志與RECOVERY_FILE_DEST 視圖

1. RECOVERY_FILE_DEST 視圖的作用 RECOVERY_FILE_DEST 是 Oracle 數據庫用于 管理快速恢復區&#xff08;Fast Recovery Area, FRA&#xff09; 的一個視圖。FRA 是 Oracle 提供的一種集中存儲恢復相關文件&#xff08;如歸檔日志、備份文件、閃回日志等&#xff09;的區域。…

零基礎玩轉物聯網-串口轉以太網模塊如何快速實現與MQTT服務器通信

目錄 1 前言 2 環境搭建 2.1 硬件準備 2.2 軟件準備 2.3 驅動檢查 3 MQTT服務器通信配置與交互 3.1 硬件連接 3.2 開啟MQTT服務器 3.3 打開配置工具讀取基本信息 3.4 填寫連接參數進行連接 3.5 通信測試 4 總結 1 前言 MQTT&#xff1a;全稱為消息隊列遙測傳輸協議&#xff08;…

六、Sqoop 導出

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月7日 專欄&#xff1a;Sqoop教程 Apache Sqoop 不僅擅長從關系型數據庫 (RDBMS) 向 Hadoop (HDFS, Hive, HBase) 導入數據&#xff0c;同樣也強大地支持反向操作——將存儲在 Hadoop 中的數據導出 (Export) 回關系型數據庫。…

數據結構-如果將堆結構應用到TOP-K問題上會怎樣?

數據結構的應用-如何用堆解決TOP-K問題 前言一、TOP-K問題是什么&#xff1f;二、如何用堆解決TOP-K問題1.怎么建堆&#xff0c;建大堆還是小堆&#xff1f;2.代碼實現 總結 前言 本篇文章進行如何用堆結構解決TOP-K問題的講解 一、TOP-K問題是什么&#xff1f; TOP-k問題&am…

Elasticsearch的索引

正向索引和倒排索引 什么是正向索引&#xff1f; 傳統的數據庫采用正向索引&#xff0c;如MySQL將表中的id創建索引&#xff0c;正向索引在進行不是id為索引進行搜索的時候&#xff0c;會逐條進行查詢&#xff0c;比方說 上圖的表格&#xff0c;數據庫進行逐條查詢&#xff0c;…

分散電站,集中掌控,安科瑞光伏云平臺助力企業綠色轉型

本項目位于香港全境共計52個分布式光伏站&#xff0c;總裝機容量8.6MW。發電模式自發自用&#xff0c;余電上網&#xff0c;逆變器采用陽光電源SG100CX、SG20RT等12種型號共計103臺&#xff0c;其余型號共計15臺。每個站點均配置氣象站。 項目采用AcrelCloud-1200分布式光伏運…

開發記錄:修復一些Bug,并實現兩個功能

開發記錄&#xff1a; &#x1f4cb; 工作概述 到今天主要完成了AI閱讀助手的兩大核心功能&#xff1a;前情提要和名詞解釋&#xff0c;并對相關交互體驗進行了優化。通過流式SSE技術實現了實時AI內容生成&#xff0c;大幅提升了用戶體驗。 &#x1f3af; 主要完成功能 1…

LLM基礎1_語言模型如何處理文本

基于GitHub項目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介紹 tiktoken&#xff1a;OpenAI開發的專業"分詞器" torch&#xff1a;Facebook開發的強力計算引擎&#xff0c;相當于超級計算器 理解詞嵌入&#xff1a;給詞語畫"…

【HarmonyOS 5.0】開發實戰:從UI到Native全解析

一、環境搭建與項目創建 ??跨平臺安裝?? DevEco Studio支持Windows/macOS系統&#xff0c;安裝包集成HarmonyOS SDK、Node.js和OHPM工具鏈。 Windows&#xff1a;雙擊.exe選擇非中文路徑macOS&#xff1a;拖拽.app至Applications目錄驗證&#xff1a;通過Help > Diagnos…

零知開源——STM32F103RBT6驅動 ICM20948 九軸傳感器及 vofa + 上位機可視化教程

STM32F1 本教程使用零知標準板&#xff08;STM32F103RBT6&#xff09;通過I2C驅動ICM20948九軸傳感器&#xff0c;實現姿態解算&#xff0c;并通過串口將數據實時發送至VOFA上位機進行3D可視化。代碼基于開源庫修改優化&#xff0c;適合嵌入式及物聯網開發者。在基礎驅動上新增…

華為OD最新機試真題-食堂供餐-OD統一考試(B卷)

題目描述 某公司員工食堂以盒飯方式供餐。 為將員工取餐排隊時間降低為0,食堂的供餐速度必須要足夠快,現在需要根據以往員工取餐的統計信息,計算出一個剛好能達成排隊時間為0的最低供餐速度。即,食堂在每個單位時間內必須至少做出 多少價盒飯才能滿足要求。 輸入描述 第1行…