依賴注入的三種實現方式詳解

一、依賴注入的三種實現方式 php

依賴注入是一種編程技術,目的是為了降低耦合性、提高可測試性和可擴展性,它可以將對象之間的依賴關係從程序中抽象出來並在外部進行管理,從而使程序更加靈活。而在 php 中,實現依賴注入有三種方式,分別是構造器注入、屬性注入、方法注入。

構造器注入


class Person{
    public function __construct(Car $car){
        $this->car = $car;
    }
}
$car = new Car();
$person = new Person($car);

構造器注入是一種通過類的構造器方法接收依賴對象的方式。在上述代碼中,Person 類需要一個 Car 類的實例,所以在其構造器中聲明了一個參數 $car,通過參數傳遞的方式將 Car 的實例傳遞給了 Person 的構造器,而 Person 對象在實例化時則會自動將傳入的 Car 實例賦值給自己的 $car 屬性。

屬性注入


class Person{
    public $car;
}
$car = new Car();
$person = new Person();
$person->car = $car;

屬性注入是一種通過聲明類的公共屬性來接收依賴對象的方式。通過公共屬性直接將Car類的實例賦值給Person類的屬性 $car,實現依賴注入。

方法注入


class Person{
    public $car;
    public function setCar(Car $car){
        $this->car = $car;
    }
}
$car = new Car();
$person = new Person();
$person->setCar($car);

方法注入是一種通過類的公共方法來接收依賴對象的方式。Person 類中聲明了一個 setCar 方法,通過方法傳遞 Car 的實例並將其賦值給 $car 屬性,實現依賴注入。

二、依賴注入的兩種實現方式

構造器依賴注入


class Person{
    public function __construct(Car $car){
        $this->car = $car;
    }
}
$car = new Car();
$person = new Person($car);

構造器依賴注入,在構造函數中依賴對象

Setter 方法依賴注入


class Person{
    public $car;
    public function setCar(Car $car){
        $this->car = $car;
    }
}
$car = new Car();
$person = new Person();
$person->setCar($car);

Setter 方法依賴注入,在 Setter 方法中依賴對象

三、依賴注入的三種實現方式區別

構造器依賴注入:類似於參數傳入,它將依賴關係放到構造函數中,使代碼更加清晰明了,並且遵循了單一職責原則。容易維護和測試,但是在依賴鏈過長時,代碼可讀性會下降。如果創建新對象時初始化參數缺失,則需要重載構造函數並傳入缺失的參數。

Setter 方法依賴注入:Setter 方法依賴注入是在代碼運行期間通過 Setter 方法設置依賴關係。相比於構造器注入,Setter 方法依賴注入更加靈活,可以省略一些必需的參數,而且對於可選依賴項也能更好地支持。缺點是它隱藏了類的依賴關係,難以確定依賴的位置,代碼可讀性差。

屬性注入:屬性注入是一種非常簡單的依賴注入方法,但是它的缺點在於實現上的靈活性差,在某些情況下會破壞封裝性,降低代碼的可測試性。而且屬性注入容易讓人忽略依賴關係,導致類之間產生緊密的耦合。

四、依賴注入的三種實現方式的優缺點

構造器注入的優缺點

優點:

1. 遵循了單一職責原則;

2. 依賴關係直觀。

缺點:

1. 構造函數的參數數量容易增多;

2. 構造函數多次調用會導致性能問題。

Setter 方法注入的優缺點

優點:

1. 靈活性比較高,可以在對象實例化後動態修改對象;

2. 在依賴環節比較棘手的情況下,可以通過 Setter 方法注入來像拼圖一樣解決。

缺點:

1. Setter 方法可能會被濫用,使得類的依賴關係更加難以理解;

2. 需要修改對象狀態,會影響對象的一致性和不可變性;

3. 依賴關係不可見。

屬性注入的優缺點

優點:

1. 比較簡單容易理解;

2. 在創建對象實例時僅需要一行代碼。

缺點:

1. 會破壞對象的封裝性;

2. 對象的創建和依賴關係之間易混淆;

3. 依賴關係不可見。

五、依賴注入的三種方式

構造器注入


class Person {
        private $car;
        public function __construct(Car $car) {
            $this->car = $car;
        }
    }
    $car = new Car();
    $person = new Person($car);

Setter 方法注入


class Person{
        private $car;
        public function setCar(Car $car){
            $this->car = $car;
        }
    }
    $car = new Car();
    $person = new Person();
    $person->setCar($car);

屬性注入


class Person{
        public $car;
    }
    $car = new Car();
    $person = new Person();
    $person->car = $car;

六、spring 常用的三種注入方式

Setter 注入

將依賴項暴露為符合 JDK Java Bean 規範的 Bean 屬性導出,並通過 Bean 屬性設置進行注入。

構造器注入

在 Bean 定義文件中聲明構造器函數,並將 Bean 的依賴項傳遞給構造器函數。

Auto-wiring 注入

自動裝配是一種通過 Spring 容器自動確定 Bean 依賴關係的方法。在自動裝配過程中,Spring 容器會自動將 Bean 之間的依賴關係映射到相應的 Bean 屬性或構造器參數上。

七、總結

依賴注入是一種為了降低耦合性、提高可測試性和可擴展性的編程技術。在 php 中,有三種實現依賴注入的方式,分別是構造器注入、屬性注入、方法注入。這三種方式各有優缺點,需要根據具體業務場景選擇合適的實現方式。

在 spring 中,常用的三種實現依賴注入的方式是 Setter 注入、構造器注入、Auto-wiring 注入,相對於 php 中的實現方式,更加靈活和複雜,但也更加強大。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236600.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:00
下一篇 2024-12-12 12:00

相關推薦

  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟件。在VB中,有許多不同的方法可以運行程序,包括編譯器、發佈程序以及命令行。在本文中…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網絡應用中流…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導着程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Python三種基本輸入元素

    本文將從多個方面對於Python三種基本輸入元素進行詳細的闡述並給出代碼示例。 一、Python三種基本輸入元素解答 Python三種基本輸入元素包括命令行參數、標準輸入和文件輸入…

    編程 2025-04-28
  • Python在線編輯器的優勢與實現方式

    Python在線編輯器是Python語言愛好者的重要工具之一,它可以讓用戶方便快捷的在線編碼、調試和分享代碼,無需在本地安裝Python環境。本文將從多個方面對Python在線編輯…

    編程 2025-04-28
  • Java表單提交方式

    Java表單提交有兩種方式,分別是get和post。下面我們將從以下幾個方面詳細闡述這兩種方式。 一、get方式 1、什麼是get方式 在get方式下,表單的數據會以查詢字符串的形…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Java多版本支持實現方式

    本文將從以下幾個方面闡述如何實現Java多版本支持,並給出可行的代碼示例。 一、多版本Java環境概述 Java是一門跨平台的編程語言,但是在不同的應用場景下,可能需要使用不同版本…

    編程 2025-04-27
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • Python獲取APP數據的多種方式

    如果您需要對APP進行分析、數據採集、監控或者自動化測試,那麼您一定需要獲取APP的數據。本文將會介紹一些Python獲取APP數據的方式。 一、使用ADB工具獲取APP數據 AD…

    編程 2025-04-27

發表回復

登錄後才能評論