0

我無法理解這兩種模式之間的區別。我覺得這兩個是相同但不同的程序模式。剛剛進入春天。Spring Java對象依賴注入

圖案1 - 依賴注入由構造和setter方法

class Employee{ 

    Address address ; 

    public Employee(Address address) { 
    this.address = address; 
    } 
    public void setAddress(Address address) { 
    this.address = address; 
    } 

} 

模式2 - 舊的Java對象創建

class Employee{ 
    Address address ; 
    public Employee(){ 
     address = new Address(); 
    } 
} 

我不能明白爲什麼圖案1是好的( loosly coupled)並且模式2是tightly coupled。無論如何Employee應取決於Address類。

回答

1

你的例子有點簡單,可能很容易捕捉到dependency injection的全部優點,但第一種模式更好,因爲你可以將Employe類從Address中分離出來。

在這種情況下:

class Employee { 
    private Address address ; 
    public Employee() { 
     address = new Address(); 
    } 
} 

Employee類是負責建設的Address。它使用new Address()。你現在被固定到這種地址。如果您想更改地址實現,則需要更改代碼。

But an address comes in many shapes and sizes。當您在代碼中實例化一種類型的地址時,如何使Employee與歐洲地址和日文地址一起工作?

爲了使這個更清楚,讓我們來擴展一下你的例子,並考慮Address是一個接口。 Programming to an interface is another good practice。所以現在我們有一個接口和一個實現:

class Employee { 
    private Address address; 
    public Employee() { 
     address = new JapaneseAddress(); 
    } 
    ... 
} 

現在看到問題了嗎?如果您以後需要歐洲地址,則需要進入代碼並進行一些更改。

相反,如果你有這樣的:

class Employee { 
    private Address address ; 

    public Employee(Address address) { 
     this.address = address; 
    } 
    ... 
} 

你現在可以注入任何你喜歡的實現,而不觸及代碼。

+0

感謝您的解釋 – 2015-04-07 05:35:38

1

在第一種情況下,你可以在運行時動態發送地址類(基本上,依賴注入意味着),其中在第二種情況下,在編碼你可能不知道地址對象需要的時間。

假設您有一個數據庫連接對象而不是地址對象。讓我們假設你的僱員對象需要這個數據庫對象出於任何原因。

現在,如果你不知道要連接到(你可能需要連接到不同的數據庫的基礎上,ENV。PROD,開發,QA等)第二種方法亙古不工作的數據庫。在第一種方法中,您可以從配置文件獲取此配置,然後在運行時動態發送連接對象。

1

因爲如果你使用模式1,如果你想添加另一個功能,它會更容易。該字段(這是你的情況下的地址)可以很容易地被另一個具體類替換。

例子,讓我們假設你想創建一個日誌框架。

使用模式1模式1

public class LoggingManager { 
    private Logger logger; 

    public void doLog(String message) { 
     logger.log(message); 
    } 

    //setter getter here 
} 

,你可以讓IoC容器分配什麼樣的日誌記錄日誌經理會做的(它可以被記錄到文件或控制檯或可能存儲日誌信息到數據庫中,因此它鬆散耦合)。

模式2

public class LoggingManager { 
    private Logger logger; 

    public LoggingManager() { 
     logger = new FileLogger(); 
    } 

    // same method as above 
} 

,你可以在摘要中看到,日誌管理器將只能夠做一兩件事,記錄日誌信息的文件。