一、依賴注入的三種實現方式 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