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

Spring 依賴注入三大模式深度解析:介面注入、Setter 注入、建構子注入

     編輯:關於JSP

    核心概念

    依賴注入(DI):讓元件依賴抽象(介面),具體實現由容器在執行期注入,實現鬆耦合。Spring 提供三種注入方式,本質皆是「由外部決定依賴關係」。

    一、介面注入

    定義注入介面,被注入類別必須實作該介面。容器透過介面方法注入依賴。

    // 1. 定義注入介面
    public interface IBusiness {
        void createDI(DataBase db);
    }
    
    // 2. 業務類實作介面
    public class Business implements IBusiness {
        private DataBase db;
        public void createDI(DataBase db) { this.db = db; } // 介面方法注入
        public void getData() { db.getData(); }
    }
    
    // 3. 使用端
    public class TestBusiness {
        private Business business = new Business();
        public void getData() {
            business.createDI(new OracleDataBase()); // 手動注入(或由容器調用)
            business.getData();
        }
    }
    

    特點:強制實作介面、侵入性強、現代 Spring 較少使用(Spring 核心不直接支援,需自行實作回調)。

    二、Setter 注入

    提供 setXxx() 方法,容器透過反射呼叫 setter 注入依賴。Spring 最推薦、最靈活 的方式。

    public class Business {
        private DataBase db;
        public void setDataBase(DataBase db) { this.db = db; } // Setter 注入點
        public void getData() { db.getData(); }
    }
    

    XML 配置:

    <bean id="business" class="com.demo.Business">
        <property name="dataBase" ref="oracleDataBase"/>
    </bean>
    <bean id="oracleDataBase" class="com.demo.OracleDataBase"/>
    

    優點:可選依賴(可為 null)、支援循環依賴、可重新配置、可讀性高。

    三、建構子注入

    透過建構子參數注入,建構子完成後物件即處於完全初始化狀態。適合強制依賴、不可變物件。

    public class Business {
        private final DataBase db; // final 不可變
        public Business(DataBase db) { this.db = db; } // 建構子注入
        public void getData() { db.getData(); }
    }
    

    XML 配置:

    <bean id="business" class="com.demo.Business">
        <constructor-arg ref="oracleDataBase"/>
    </bean>
    

    優點:不可變性、執行緒安全、依賴不可為 null、IDE 友善(建構子參數明確)。

    三種模式對比表

    維度介面注入Setter 注入建構子注入
    侵入性高(須實作介面)低(POJO)低(POJO)
    依賴可選性否是(可為 null)否(必須提供)
    循環依賴支援困難良好需配合 @Lazy
    不可變性否否是(配合 final)
    Spring 推薦度低高(傳統)高(現代最佳實踐)

    現代 Spring 最佳實踐建議

    1. 優先使用建構子注入:確保不可變、執行緒安全、依賴明確。
    2. 可選依賴用 Setter 或 @Autowired(required=false)。
    3. 避免介面注入:除非框架層面需要回調契約。
    4. 搭配 Lombok @RequiredArgsConstructor 自動產生建構子,減少樣板碼。
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved