Spring IOC 原理

Spring IoC(控制反轉)是Spring框架的核心機制,其原理是通過容器管理對象生命周期依賴關系,實現解耦。

1. 控制反轉(IoC)核心思想

  • 傳統模式:對象主動創建依賴(如new Service()),導致高耦合。
  • IoC模式:將對象創建和依賴注入的控制權交給容器,開發者只需聲明依賴關系。
  • 數學描述:設對象集合為O={o1,o2,…,on}O = \{o_1, o_2, \dots, o_n\}O={o1?,o2?,,on?},依賴關系為有向圖G=(O,E)G = (O, E)G=(O,E),容器通過拓撲排序解析依賴。

2. 容器實現機制

  • BeanFactory:基礎容器接口,提供getBean()方法獲取對象實例。
  • ApplicationContext:擴展容器,支持事件發布、國際化等高級功能。
  • 工作流程:
    配置文件/注解
    容器解析
    創建Bean定義
    實例化Bean
    依賴注入
    初始化Bean

3. 依賴注入(DI)方式

  • 構造器注入:通過構造函數傳遞依賴
    public class UserService {private final UserDao userDao;// 容器自動注入public UserService(UserDao userDao) {this.userDao = userDao;}
    }
    
  • Setter注入:通過setter方法賦值
    public class OrderService {private PaymentService paymentService;// 容器調用setterpublic void setPaymentService(PaymentService ps) {this.paymentService = ps;}
    }
    
  • 字段注入:通過@Autowired直接注入字段(需謹慎使用)

4. 生命周期管理

容器管理的Bean生命周期:

實例化 → 屬性填充 → BeanNameAware → BeanFactoryAware → 
PreInitialization → @PostConstruct → InitializingBean → 
自定義init → PostInitialization → 使用期 → @PreDestroy → 
DisposableBean → 自定義destroy

5. 配置元數據

  • XML配置:傳統方式,顯式定義Bean
    <bean id="userDao" class="com.dao.UserDaoImpl"/>
    <bean id="userService" class="com.service.UserService"><constructor-arg ref="userDao"/>
    </bean>
    
  • 注解驅動:現代主流方式
    @Repository  // 標識Bean
    public class UserDaoImpl {}@Service
    public class UserService {@Autowired  // 自動注入private UserDao userDao;
    }
    
  • Java配置:通過@Configuration
    @Configuration
    public class AppConfig {@Beanpublic UserDao userDao() {return new UserDaoImpl();}
    }
    

關鍵優勢

  • 解耦:對象不關心依賴創建,只需聲明接口
  • 可測試性:依賴可替換為Mock對象
  • 靈活性:通過配置切換實現類(如DataSource切換)
  • 維護性:依賴關系集中管理,避免散落在代碼中

典型應用場景:當需要將MySQLRepository替換為MongoRepository時,只需修改配置,無需改動業務代碼,體現了IoC的核心價值——將變化隔離在配置層。

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

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

相關文章

VSCode:基礎使用 / 使用積累

官網 Visual Studio Code - Code Editing. Redefined 記錄一、更新依賴 嘗試刪除yarn.lock文件 記錄二、“解決沖突”的方式變了 更新后&#xff0c;“解決沖突”的方式變了&#xff0c;有的時候能選中兩者&#xff0c;有的時候不能 現在又更新了&#xff0c;回復到了原來…

tcp 確認應答和超時時間

1. 確認應答之間的時間&#xff08;RTT&#xff09;這是指 從發送方發送數據到接收方返回確認&#xff08;ACK&#xff09;之間的時間。它反映的是數據傳輸的 往返延遲。例如&#xff0c;發送方發送一個數據包&#xff0c;接收方收到后&#xff0c;回傳一個確認包&#xff08;A…

圖的應用-最短路徑

最短路徑的典型用途&#xff1a;交通網絡的問題——從甲地到乙地之間是否有公路連通&#xff1f;在有多條通路的情況下&#xff0c;哪一條路最短&#xff1f;交通網絡用有向網來表示&#xff1a;頂點——表示地點&#xff0c;弧——表示兩個地點有路連通&#xff0c;弧上的權值…

【qt5_study】1.Hello world

模板 作為初學者我們選擇第一個Application(Qt)和 Qt Widgets Application,所謂的模板就是 Qt為了方便開發程序,在新建工程時可以讓用戶基于一種模板來編寫程序,包括 cpp文件, ui文件都已經快速的創建,而不用用戶手動創建這些文件。 基類 這里默認選擇的基類為 QMainWin…

項目構想|文生圖小程序

Date: August 4, 2025項目介紹 &#x1f44b;&#xff0c;我們通過 Vibe Coding 做一個文字生成圖片的小程序。 我們會從需求分析、技術選型、UI設計、項目構筑到最后打包&#xff0c;一路嘗試 Vibe Coding 實現。 創建項目 創建文件夾&#xff1a;ai-pic-mini-app 采用 Git 進…

TiDB/MongoDB/Taosdb存儲引擎概覽

數據庫類型存儲引擎數據結構源碼位置tidbRockDBLSM樹https://github.com/facebook/rocksdbmongodbWiredTigerB 樹/LSM樹https://github.com/wiredtiger/wiredtigerTDengineTSDBBRINhttps://github.com/taosdata/TDengine 1、tidb存儲引擎概覽 LSM樹數據結構描述LSM樹(Log Str…

qt窗口--01

文章目錄qt窗口--01窗口概覽菜單欄工具欄狀態欄浮動窗口子窗口對話框model結語很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 作者&#xff1a;?( ‘ω’ )?260 我的專欄&#xff1a;qt&#xff0c;Li…

Neo4j 社區版 Mac 安裝教程

最近用到了nebulagraph圖數據庫做金融反欺詐項目&#xff0c;雖然nebula屬于分布式架構&#xff0c;但依然感覺nebula使用不太順手&#xff0c;這里順便研究一下neo4j這款數據庫如何&#xff0c;這里先從安裝開始&#xff1f; 一、 準備工作 確認 Java 版本要求&#xff1a; N…

Android Studio(2025.1.2)Gemini Agent 使用指南

Android Studio&#xff08;2025.1.2&#xff09;Gemini Agent 使用指南 文章目錄Android Studio&#xff08;2025.1.2&#xff09;Gemini Agent 使用指南1. 什么是 Gemini Agent&#xff1f;2. 如何啟用和配置 Gemini Agent2.1 獲取 API Key2.2 在 Android Studio 中配置3. 實…

計算機視覺--opencv(代碼詳細教程)

在計算機視覺的廣袤領域中&#xff0c;OpenCV 是一座極為關鍵的里程碑。無論是在前沿的學術研究&#xff0c;還是在蓬勃發展的工業界&#xff0c;OpenCV 憑借其強大的功能與高效的性能&#xff0c;為開發者提供了豐富的圖像處理和計算機視覺算法&#xff0c;助力無數項目落地。…

Centos6停止服務后yum改用阿里云

環境: OS:Centos 6.9 1.進入到yum配置目錄 cd /etc/yum.repos.d 2.備份 cp CentOS-Base.repo CentOS-Base.repo.bk 3.下載 wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo 問題1: 因為Centos-6早就停止了更新維護&#xff0c;阿里云鏡像網站將其倉庫…

putty+Xming(XLaunch) 遠程登錄VirtualBox中的Ubuntu24.04,顯示圖形化(GUI)界面

測試環境&#xff1a;VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 Server(no desktop)&#xff0c;均測試成功。 一、先測試putty遠程登錄VirtualBox中的Ubuntu&#xff0c;可以使用ssh、Telnet 等協議。參見拙文《ssh連接VirtualBox中的Ubuntu24.04&#xff08;win11、put…

SpringBoot微頭條實戰項目

一、項目概述 微頭條是一個基于現代技術棧構建的新聞發布和瀏覽平臺&#xff0c;旨在為用戶提供便捷的新聞閱讀體驗和高效的新聞管理功能。該項目通過前后端分離的架構設計&#xff0c;實現了用戶注冊、登錄、新聞瀏覽、搜索、發布、修改和刪除等功能&#xff0c;同時通過JWT技…

如何給電腦換個ip地址?電腦換ip幾種方法

更換電腦的IP地址的方法取決于你的具體需求和網絡環境&#xff08;是換本地局域網IP還是換對外公網IP&#xff09;。以下是幾種常見的方法&#xff1a; 一、更換本地局域網IP地址&#xff08;在同一個網絡內&#xff09; 這個IP地址通常由你的路由器&#xff08;或公司的網絡管…

Pytest項目_day04(Python做接口請求)

Requests包 在python中&#xff0c;可以使用requests包&#xff0c;用于做接口請求和接口測試request支持http和https簡單的get函數調用如下&#xff1a;r.jsonr.status_coder.textget函數的帶params用法post函數的帶params用法 post也可以和get一樣在url中傳入參數在requests包…

Flink與Kafka核心源碼詳解-目錄

Flink是Apache軟件基金會下開源的分布式流批一體計算框架&#xff0c;具備實時流計算和高吞吐批處理計算的大數據計算能力。本專欄內容為Flink源碼解析的記錄與分享。 本文解析的Flink源碼版本為&#xff1a;flink-1.19.0 以下為Flink-1.19.0-完整源碼詳解的目錄導航。 Flink-…

【VLLM篇】:原理-實現

1、VLLM vLLM是一個建立在【PagedAttention】之上的高吞吐的【分布式服務引擎】&#xff0c;目標是【提高吞吐量】、【提高內存利用率】&#xff08;kv-cache內存利用率高達96%&#xff09;&#xff0c;它的內存管理分配方式從【固定分配】改進為【分頁管理】&#xff0c;類似操…

什么是 TcpCommunicationSpi

&#x1f9e9; 一、核心定位&#xff1a;什么是 TcpCommunicationSpi&#xff1f; /*** <tt>TcpCommunicationSpi</tt> is default communication SPI which uses* TCP/IP protocol and Java NIO to communicate with other nodes.*/翻譯&#xff1a;TcpCommunicat…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 詞云圖-微博評論用戶詞云圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解詞云圖-微博評論用戶詞云圖實現 視頻在線地…

數據結構----棧和隊列認識

目錄 棧&#xff08;后進先出&#xff09; 棧的實現 頭文件 初始化 入棧 注意&#xff1a; bool 判空 出棧----棧頂 注意 出棧頂元素&#xff0c;元素不會刪除 注意&#xff1a; 獲取棧中有效個數 銷毀棧 源文件操作 用棧實現遞歸* 隊列&#xff08;先進先出&a…