首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring IOC 容器深度解析:控制反轉與依賴注入的本質、實現原理與最佳實踐

     編輯:Java 綜合教學

IOC 本質:主從換位的設計思想

控制反轉 不是技術,是設計思想。傳統開發中,對象主動 new 依賴 (主動權在自己);IOC 容器接管對象創建與裝配,對象被動接受依賴 (主動權轉移給容器)。

好萊塢法則:「別調用我們,我們會調用你」—— 容器負責調度,組件只需暴露依賴接口。

IOC vs DI:同一枚硬幣兩面

維度IOC (控制反轉)DI (依賴注入)
關注點誰控制對象生命周期依賴關係如何賦值
描述角度容器視角組件視角
核心動作容器創建、管理、銷毀 Bean容器將依賴「注入」組件
Martin Fowler 命名概念較模糊2004 年明確命名,更具體

結論:IOC 是架構層面的宏觀概念,DI 是實現 IOC 的具體技術手段 (Setter/構造器/字段注入)。

Spring 容器啟動核心流程

  1. Resource 定位:讀取 applicationContext.xml / 掃描 @Component / 解析 @Configuration。
  2. BeanDefinition 註冊:將配置元數據轉為 BeanDefinition 註冊到 BeanDefinitionRegistry (Map<String, BeanDefinition>)。
  3. BeanFactoryPostProcessor:PropertyPlaceholderConfigurer 解析 ${...}、ConfigurationClassPostProcessor 解析註解配置類。
  4. 實例化:InstantiationStrategy (CGLIB/字節碼) 創建 Bean 實例。
  5. 屬性填充:BeanDefinitionValueResolver 解析引用、集合、屬性值,調用 Setter/字段注入。
  6. BeanPostProcessor 前置:AutowiredAnnotationBeanPostProcessor 處理 @Autowired、@Value;AOP 代理創建。
  7. 初始化:InitializingBean.afterPropertiesSet()、@PostConstruct、自定義 init-method。
  8. BeanPostProcessor 後置:AOP 最終代理封裝。
  9. 註冊銷毀回調:DisposableBean、@PreDestroy、destroy-method。
  10. 就緒服務:放入單例池 singletonObjects,應用程序可用。

三種注入方式對比

方式代碼示例優點缺點推薦場景
構造器注入@Autowired public Service(Repo repo) {}不可變性、強依賴檢查、易測試 (無 Spring 也能 new)循環依賴難處理、參數多啰嗦首選,所有強依賴
Setter 注入@Autowired public void setRepo(Repo repo) {}可選依賴、解決循環依賴、可重新配置對象可能處於不完整狀態、破壞封裝可選依賴、第三方庫集成
字段注入@Autowired private Repo repo;代碼極簡反射強行賦值、不可測試、隱藏依賴、最終字段無效禁止 生產代碼 (僅測試類可用)

Bean 作用域與生命周期

  • singleton (默認):容器啟動創建 (或首次獲取),全局唯一,銷毀隨容器關閉。
  • prototype:每次 getBean() 創建新實例,Spring 不管理銷毀,需自行釋放資源。
  • request/session/application/websocket:Web 環境綁定 HTTP 生命周期。

循環依賴解決機制 (三級緩存)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved