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 
} 

,你可以在摘要中看到,日志管理器将只能够做一两件事,记录日志信息的文件。