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

Spring 框架核心機制深度解析:IoC、AOP、Bean 生命週期與依賴注入全圖解

     編輯:Java 相關知識

Spring 自 2004 年首版釋出以來,憑藉低侵入設計、容器管理 Bean、AOP 切面解耦、事務整合等特性,成為 Java 企業級開發事實標準。本文系統梳理 Spring 核心架構、IoC 容器運作、依賴注入(DI)模式、Bean 作用域、自動裝配策略與實戰配置技巧,並附上原始碼級範例,助你建立完整心智模型。

一、Spring 核心優勢回顧

  • 低侵入:業務碼幾乎零 Spring API 依賴,易測試、易遷移。
  • 容器獨立:不綁定特定應用伺服器,支援獨立運行、Servlet 容器、雲原生部署。
  • IoC 解耦:依賴關係外置配置,實現「好萊塢原則」(Don't call us, we'll call you)。
  • AOP 切面:橫切關注點(事務、安全、日誌、快取)集中管理,業務碼純淨。
  • 持久層整合:JdbcTemplate、Hibernate、MyBatis、JPA 無縫整合,簡化資料存取。
  • 模組化選用:Core、Context、AOP、Tx、Web、Data 等模組按需引入。

Spring 框架架構圖

二、核心機制:IoC 容器與 Bean 管理

1. 容器啟動與 Bean 定義載入

ApplicationContext 為最常用容器介面,兩大實現:

  • ClassPathXmlApplicationContext:從類路徑載入 XML 配置(如 classpath:beans.xml)。
  • FileSystemXmlApplicationContext:從檔案系統絕對/相對路徑載入。
public class BeanTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Person p = ctx.getBean("person", Person.class);
        p.say();
    }
}

2. Eclipse 專案整合 Spring 庫

建議建立 User Library 管理 Spring JAR,專案發布時勾選「Export」將 JAR 複製至 WEB-INF/lib。或直接放入 WEB-INF/lib,配合 Maven/Gradle 依賴管理更佳。

三、依賴注入(DI)核心觀念

Spring 容器扮演「超級工廠」角色,負責:

  1. 建立、管理所有 Java 物件(Bean)。
  2. 管理 Bean 間依賴關係,採用 依賴注入(Dependency Injection,DI) 模式。

DI 本質:控制反轉(IoC)

傳統模式:呼叫者 主動 new 被依賴物件,或透過工廠取得 → 硬編碼耦合。
Spring 模式:呼叫者 被動 接受容器注入 → 依賴關係外置配置,實現解耦。

兩大注入方式對比

維度設值注入構造注入
方式Setter 方法建構子參數
優點符合 JavaBean 慣例、可選依賴友善、避免建構子膨脹、循環依賴易處理依賴順序可控、不可變性強、依賴關係封裝於建構子、符合高內聚
缺點不可變性弱、需預防 null 注入參數多時閱讀性差、所有依賴必須就緒才能實例化
建議場景選用依賴、多數業務 Bean、框架整合點核心領域物件、不可變值物件、必須依賴

最佳實踐:以設值注入為主、構造注入為輔。@Required 或 @NonNull 輔助檢查必要依賴。

四、Bean 作用域

作用域生命週期適用場景
singleton(預設)容器內單一實例,全域共享無狀態服務、DAO、Controller、工具類
prototype每次 getBean() 建立新實例有狀態物件、命令模式、每次請求需獨立實例
request單一 HTTP 請求內共享Web 請求級資料、表單綁定物件
session單一 HTTP Session 共享購物車、使用者偏好設定
global sessionPortlet 全域 Session 共享Portlet 環境跨應用共享資料

效能提醒:prototype 建立/銷毀成本高,非必要勿用。singleton Bean 需確保執行緒安全(無可變狀態或使用 ThreadLocal)。

五、自動裝配策略

在 <beans> 或 <bean> 上設定 autowire/default-autowire:

  • no(預設):手動 ref 指定,依賴關係最清晰,大型專案推薦。
  • byName:依 setter 名稱(去 set 首字母小寫)匹配 Bean id。
  • byType:依 setter 參數型別匹配,若多於一個拋出異常。
  • constructor:依建構子參數型別匹配。
  • autodetect:嘗試 constructor 失敗則 fallback byType。

排除自動裝配:

<bean id="dataSource" autowire-candidate="false" />
<beans default-autowire-candidates="*Dao" />

六、Bean 建立三種方式(補充)

  1. 構造器實例化:<bean id="..." class="..."> 呼叫無參/有參建構子。
  2. 靜態工廠方法:<bean id="..." class="FactoryClass" factory-method="createInstance"/>。
  3. 實例工廠方法:<bean id="factory" class="FactoryClass"/> <bean id="..." factory-bean="factory" factory-method="createInstance"/>。

七、現代化配置建議

  • 新專案優先採用 Java Config(@Configuration + @Bean) 或 Spring Boot 自動配置,XML 僅維護舊專案。
  • 善用 @ComponentScan、@EnableTransactionManagement、@EnableAsync 等啟用註解替代 XML 命名空間。
  • 輪廓化配置:@Profile("dev|prod|test") 區分環境差異。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved