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

Spring 核心回顧:IOC/DI、AOP、構造器注入與配置精要

     編輯:Java 綜合教學

一、IOC 與 DI:核心思想雙面鏡

1.1 控制反轉 (IOC)

  • 定義:對象創建、依賴管理的控制權從應用代碼移交給容器。
  • 本質:面向接口編程 + 配置元數據(XML/註解)驅動依賴關係構建。
  • 效果:降低組件耦合,提高可測試性、可替換性。

1.2 依賴注入 (DI)

  • 定義:容器在實例化 Bean 時,自動注入其依賴的協作者(屬性值、對象引用)。
  • 三種方式:
    1. Setter 注入:<property name="dao" ref="dao"/>,靈活、可選依賴。
    2. 構造器注入:<constructor-arg>,強依賴、不可變對象、循環依賴檢測。
    3. 接口注入(少用):實現特定接口由容器回調注入。

1.3 關鍵區別

IOC 側重控制權轉移的原理;DI 側重依賴賦值的實現過程。兩者描述同一現象的不同視角。

二、AOP:面向切面編程

2.1 解決什麼問題

業務邏輯中混雜著事務、日志、安全、緩存等橫切關注點,導致代碼分散、重復、難維護。

2.2 核心原理

  • 將橫切邏輯提取為切面。
  • 通過代理機制(JDK/CGLIB)在不修改原類的前提下,在目標方法前後織入增強邏輯。
  • 核心術語:切面、連接點、切入點、通知、織入、目標對象、引介。

2.3 典型應用場景

  • 聲明式事務管理(@Transactional)
  • 統一日志記錄、性能監控
  • 權限校驗、參數驗證
  • 緩存攔截(@Cacheable)

三、構造器注入詳解

3.1 XML 配置

<bean id="userService" class="cn.service.UserServiceImpl">
    <constructor-arg index="0" ref="userDao"/>
    <constructor-arg index="1" value="defaultValue"/>
    <constructor-arg index="2" type="java.lang.String" value="typeSpecified"/>
</bean>

3.2 關鍵屬性

屬性作用
index參數位置索引(從 0 開始),解決同類型參數歧義
type參數全限定類名,解決同類型參數歧義
name參數名(需啟用 -parameters 編譯選項或 JDK 8+)

3.3 優缺點對比

維度構造器注入Setter 注入
不可變性支持 final 字段,構造後不可變字段可變,需額外檢查
強依賴表達天然表達「無此依賴無法工作」需文檔約定
循環依賴容器啟動時報錯,暴露設計缺陷容器可通過早期暴露引用解決(有隱患)
可選依賴不友好,需重載構造器天然支持
繼承友好子類需調用 super(),參數傳遞繁瑣子類無感知

3.4 現代最佳實踐

Spring 4.3+ 支持單構造器隱式注入:若 Bean 只有一個構造器,無需 @Autowired 也會自動注入。推薦構造器注入作為首選,配合 Lombok @RequiredArgsConstructor 生成構造器,實現不可變、線程安全、易測試的服務類。

四、常用配置片段速查

// 命名空間
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="https://www.springframework.org/schema/context"
       xmlns:aop="https://www.springframework.org/schema/aop"
       xsi:schemaLocation="...">

<context:component-scan base-package="cn.service"/> // 掃描註解 Bean
<context:property-placeholder location="classpath:jdbc.properties"/> // 屬性佔位符
<aop:aspectj-autoproxy/> // 啟用 @AspectJ
<tx:annotation-driven/> // 啟用 @Transactional

五、總結

Spring 核心三板斧:IOC 容器管理對象生命週期、DI 實現鬆耦合裝配、AOP 分離橫切邏輯。構造器注入配合最終字段,構建健壯的領域服務;聲明式事務與緩存讓業務代碼專注核心邏輯。理解原理、掌握配置、遵循最佳實踐,是 Spring 開發者的必修課。

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