【问题标题】:Inversion of Control definition [duplicate]控制反转定义[重复]
【发布时间】:2015-03-21 16:15:28
【问题描述】:
在 Spring 参考中我们读到:
IoC 也称为依赖注入 (DI)。这是一个过程,对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系,即与它们一起工作的其他对象.
我理解正确吗?依赖项是 -
1) 他们使用的其他对象,仅通过构造函数参数,工厂方法的参数
2)在对象实例被构造或从工厂方法返回后设置的属性
请给出这两项的简单例子和第二个问题——工厂方法是什么?请详细解释一下。
【问题讨论】:
标签:
java
spring
inversion-of-control
【解决方案1】:
根据该定义,依赖项是:
他们使用的其他对象
例如,假设你有这个类:
class Widget {
public void DoSomething() {
WidgetCalculator calculator = new WidgetCalculator();
int someValue = calculator.calculate();
// and so on...
}
}
在此设置中,Widget 依赖于 WidgetCalculator。它是Widget“使用”的对象,或者更确切地说,是Widget 执行其自身工作所需的对象。上面的代码完成了这项工作,但它导致了紧密耦合。您不能轻易换出 WidgetCalculator 的不同实现,例如,破坏一个类的更改可能会破坏另一个类,等等。
这就是dependency inversion 变得有用的地方。它可以要求一个WidgetCalculator 的实例,而不是创建一个实例。这可能很简单:
class Widget {
public void DoSomething(WidgetCalculator calculator) {
int someValue = calculator.calculate();
// and so on...
}
}
现在,为了执行该操作,任何调用该操作的消费代码都需要为 Widget 提供其依赖项。如果Widget 上有很多代码具有该依赖项,则可以将其提升为构造函数参数,这样在不提供依赖项的情况下,使用代码甚至无法创建 Widget:
class Widget {
private final WidgetCalculator calculator;
public Widget(WidgetCalculator calculator) {
this.calculator = calculator;
}
public void DoSomething() {
int someValue = this.calculator.calculate();
// and so on...
}
}
可以通过多种方式提供依赖项,但核心原则是对象要求向其提供依赖项,而不是寻找依赖项本身。