Spring Ioc Bean 到底是什么

Bean 到底是什么?

簡單來說,Spring Bean 就是一個由 Spring IoC 容器負責創建、管理和裝配的 Java 對象。

它不是一種新的技術,它本質上還是一個普普通通的 Java 對象(POJO - Plain Old Java Object),但它的“戶口”被注冊到了 Spring 容器中,從此它就不再是一個“野生”的對象,而是一個受容器管理的“公民”。


最核心的區別:Bean vs. 普通的 Java 對象

為了徹底理解 Bean,我們把它和我們自己用 new 創建的普通對象做個對比。

特性普通 Java 對象 (自己 new 的)Spring Bean (容器管理的)
“生父”你(開發者)Spring IoC 容器
創建方式MyObject obj = new MyObject();通過配置(如 @Component 注解),由容器在后臺自動創建。
生命周期由你控制。當沒有引用指向它時,由 JVM 垃圾回收器回收。由容器全程管理:從創建 -> 依賴注入 -> 初始化 -> 使用 -> 銷毀
依賴關系你必須手動創建并“塞給”它。new Service(new Repository());容器根據 @Autowired 等注解,自動找到并注入依賴。
“戶口”野生對象,沒戶口,不受管理。在容器中有唯一標識(Bean ID),有“戶口”,被嚴格管理。
“超能力”沒有。它只是一個普通的對象。有! 容器可以賦予它 AOP 等“超能力”(如事務、日志、安全)。

我們用下面的比喻來詳細描述:

  • 普通 Java 對象:就像一個生活在深山里的隱士。他自己蓋房子(創建),自己找食物(處理依賴),自生自滅(生命周期),與世隔絕。
  • Spring Bean:就像一個生活在大城市里的注冊公民
    • 政府(IoC 容器)會給他分配一個身份證號(Bean ID)。
    • 政府會幫他蓋好房子,并把水電煤氣都接好(創建并注入依賴)。
    • 他享受城市的公共服務,比如警察巡邏(AOP 安全切面)、銀行服務(AOP 事務管理)。
    • 他需要遵守城市的規定,比如按時交稅、參加社區活動(遵循容器的生命周期回調)。

為什么要用 Bean,而不是自己 new

因為把對象變成 Bean 交給容器管理,能帶來巨大的好處,這些好處正是 IoC 要解決的問題:

  1. 解耦 (Decoupling)UserService 不需要知道它的 UserRepositoryMySqlUserRepository 還是 MongoUserRepository。它只需要聲明“我需要一個 UserRepository”,容器會把配置好的那個給他。更換實現時,UserService 的代碼完全不用動。

  2. 生命周期管理 (Lifecycle Management):你不需要關心一個復雜的對象(比如數據庫連接池 DataSource)什么時候初始化、什么時候關閉。容器會幫你處理好這一切。你可以在 Bean 的特定生命階段(如創建后、銷毀前)執行自定義邏輯(使用 @PostConstruct, @PreDestroy)。

  3. 依賴注入 (Dependency Injection):自動解決對象之間的“你中有我,我中有你”的復雜關系。容器像一個聰明的裝配工,自動把所有零件組裝成一部可以工作的機器。

  4. 作用域控制 (Scope Management):容器可以精確控制 Bean 的實例數量。

    • Singleton (默認):整個應用中只有一個實例。這對于無狀態的 Service 或 Repository 非常適合,節省了大量內存開銷。
    • Prototype:每次請求時都創建一個新的實例。
    • Request/Session (Web環境):在一次 HTTP 請求或一個會話中共享同一個實例。
  5. AOP 的基礎 (Foundation for AOP)這是最神奇的一點! 因為容器控制了 Bean 的創建過程,所以它有機會返回一個**代理對象(Proxy)**而不是原始對象。這個代理對象可以在你調用真實方法前后,悄悄地幫你做很多額外工作,比如:

    • 在你調用 @Transactional 標記的方法前,開啟事務。
    • 在你調用方法后,提交或回滾事務。
    • 記錄方法執行時間(日志切面)。
    • 進行權限檢查(安全切面)。
      如果對象是你自己 new 的,Spring 就完全沒有機會對它進行“增強”。

如何讓一個對象成為 Bean?

在現代 Spring Boot 應用中,主要有兩種方式:

  1. 使用構造型注解(Stereotype Annotations)

    • @Component:通用的組件注解。
    • @Service:用于業務邏輯層。
    • @Repository:用于數據訪問層。
    • @Controller / @RestController:用于 Web 控制器層。
      只要在類上加上這些注解,Spring 的組件掃描(@ComponentScan)就會發現它,并將其注冊為 Bean。
    @Service // 告訴Spring:請管理我,我是一個Bean!
    public class MyUserService {// ...
    }
    
  2. 使用 @Bean 注解
    在配置類(@Configuration)中,在一個方法上使用 @Bean 注解。這個方法的返回值就會被注冊為一個 Bean。這種方式非常適合用來注冊那些來自第三方庫、我們無法直接修改源碼的類。

    @Configuration
    public class AppConfig {@Bean // 告訴Spring:這個方法的返回值是一個Bean!public RestTemplate restTemplate() {// 這里可以進行復雜的初始化配置return new RestTemplate();}
    }
    

總結

Spring Bean 不是一個神秘的東西,它就是一個被 Spring IoC 容器接管了“生老病死”和“社會關系”的普通 Java 對象。 這種“接管”帶來了巨大的架構優勢,使得我們的代碼更加靈活、可維護,并能輕松獲得事務、安全等強大的企業級服務。

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

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

相關文章

【PCIe 總線及設備入門學習專欄 5.1.1 -- PCIe PERST# 信號的作用】

文章目錄 PCIe PERSTN#PERST# 信號作用概述簡要定義PERST# 的關鍵功能PERST# 的時序圖示意Synopsys PCIe EP IP 中 PERST# 的作用關鍵信號接口典型復位流程示例代碼(Verilog for Synopsys PCIe)PERST# 使用場景舉例(Synopsys PCIe EP)1. 系統上電初始化2. 熱復位特定設備3.…

使用python的pillow模塊將圖片轉化為灰度圖,獲取值和修改值

使用python的pillow模塊可以將圖片轉化為灰度圖, 可以獲取灰度圖的特定點值,區域值, 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

記憶力訓練day41

通常是一個地點記2組詞 數字和人體記憶宮殿更注重 即時性;地點記憶宮殿是長久性

自動微分模塊

一.前言本章節我們是要學習梯隊計算,?動微分(Autograd)模塊對張量做了進?步的封裝,具有?動求導功能。?動微分模塊是構成神經?絡 訓練的必要模塊,在神經?絡的反向傳播過程中,Autograd 模塊基于正向計算…

深度學習·目標檢測和語義分割基礎

邊緣框 不是標準的x,y坐標軸。邊緣框三種表示:左上右下下坐標,左上坐標長寬,中心坐標長寬 COCO 目標檢測數據集的格式:注意一個圖片有多個物體,使用csv或者文件夾結構的格式不可取。 錨框算法 生成很多…

ffmpeg音視頻處理大綱

FFmpeg 是一個功能強大的開源音視頻處理工具集,其核心代碼以 C 語言實現。下面從源碼角度分析 FFmpeg 如何實現轉碼、壓縮、提取、截取、拼接、合并和錄屏等功能: 一、FFmpeg 核心架構與數據結構 FFmpeg 的源碼結構圍繞以下核心組件展開: lib…

網絡安全小練習

一、docker搭建 1.安裝 2.改變鏡像源(推薦國內鏡像源:阿里云鏡像源) 登錄阿里云容器鏡像源服務( 阿里云登錄 - 歡迎登錄阿里云,安全穩定的云計算服務平臺 ) 復制系統分配的專屬地址 配置 sudo mkdir …

數據結構——順序表的相關操作

一、順序表基礎認知?1.順序表的定義與特點?順序表是數據結構中一種線性存儲結構,它將數據元素按照邏輯順序依次存儲在一片連續的物理內存空間中。簡單來說,就是用一段地址連續的存儲單元依次存放線性表的元素,且元素之間的邏輯關系通過物理…

2025最新國產用例管理工具評測:Gitee Test、禪道、藍凌測試、TestOps 哪家更懂研發協同?

在快節奏的 DevOps 時代,測試用例管理已不再是 QA 的獨角戲,而是穿透需求—開發—測試—交付全流程的核心樞紐。想象一下,如果用例結構混亂,覆蓋不全,甚至丟失版本變更歷史,不僅協作亂,還影響交…

在線評測系統開發交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 實驗內容爬蟲Web系統設計數據分析實驗指導爬蟲Web系統設計自然語言處理與信息檢索數據可視化評分標準FAQ實驗二:在線評測系統實驗概述實驗內容Step1:題目管理Step2:題目評測S…

Linux操作系統從入門到實戰(十)Linux開發工具(下)make/Makefile的推導過程與擴展語法

Linux操作系統從入門到實戰(十)Linux開發工具(下)make/Makefile的推導過程與擴展語法前言一、 make/Makefile的推導過程1. 先看一個完整的Makefile示例2. make的工作流程(1)尋找Makefile文件(2&…

NFS磁盤共享

步驟:注意事項?:確保服務端防火墻關閉,或者允許2049端口通信,客戶端需具備讀寫權限。服務器端安裝NFS服務器:sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 連接未打開

System.Data.OracleClient.OracleException:ORA-06413: 連接未打開 oracle 報錯 ORA-06413: 連接未打開 db.Open();的報錯鏈接未打開,System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 連接未打開 關于ORA-06413錯誤(…

【PCIe 總線及設備入門學習專欄 5.1.2 -- PCIe EP core_rst_n 與 app_rst_n】

文章目錄 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器內部邏輯復位作用控制方式2. app_rst_n — 應用層/用戶邏輯復位作用特點兩者關系圖示:示例流程(Synopsys EP)rst_sync[3] 的作用詳解(復位同步邏輯)為什么使用 rst_sync[3]?圖示說明Synopsys 官方手…

Python初學者筆記第二十期 -- (文件IO)

第29節課 文件IO 在編程中,文件 I/O(輸入/輸出)允許程序與外部文件進行數據交互。Python 提供了豐富且易用的文件 I/O 操作方法,能讓開發者輕松實現文件的讀取、寫入和修改等操作。 IO交互方向 從硬盤文件 -> 讀取數據 -> 內…

Java JUC包概述

Java 的 java.util.concurrent(簡稱 JUC)包是 JDK 5 及以后引入的并發編程工具包,旨在解決傳統線程模型(如 synchronized、wait/notify)的局限性,提供更靈活、高效、可擴展的并發編程組件。它極大簡化了多線…

LeetCode--44.通配符匹配

前言:不知不覺又斷更一天了,其實昨天就把這道題寫得差不多了,只是剛好在力扣里面看見了一種新的解法,本來想寫出來的,但是我把它推到今天了,因為太晚了,但是今天又睡懶覺了,所以我直…

WHAT - 依賴管理工具 CocoaPods

文章目錄1. 什么是 CocoaPods?2. 如何安裝 CocoaPods?(1) 確保已安裝 Ruby(macOS 默認自帶)(2) 安裝 CocoaPods(3) 驗證安裝3. 在 React Native 項目中使用 CocoaPods(1) 進入 iOS 目錄(2) 初始化 Podfile(如果不存在&…

C++ Boost Aiso TCP 網絡聊天(服務端客戶端一體化)

代碼功能說明: 程序模式: 主動連接模式:當用戶指定對端 IP 和端口時,嘗試連接到對端被動監聽模式:當用戶未指定對端 IP 時,等待其他節點連接線程模型: 主線程:處理用戶輸入和消息發送接收線程:后臺接收并顯示對端消息關鍵組件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45獵人寶寶狼 技能恢復宏已知3.45BUG RL技能位會清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修復以前可用宏一鍵恢復狀態-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…