"Inversion of Control"定义
"Inversion of Control"定义
这个问题已经有了答案:
在Spring参考资料中我们读到:
IoC也被称作依赖注入(DI)。它是一个过程,其中对象只通过构造函数参数、工厂方法的参数或被构造或从工厂方法返回后设置在对象实例上的属性来定义它们的依赖关系,也就是它们与其他对象一起工作的对象。
我的理解正确吗?这些依赖关系是 -
1) 只通过构造函数参数、工厂方法的参数与其他对象一起工作
2) 在构造之后或从工厂方法返回之后设置在对象实例上的属性
请给出这两个项目的简单示例和第二个问题 - 什么是工厂方法?请详细解释。
admin 更改状态以发布 2023年5月24日
依赖关系是指那些:
被它们所使用的其他对象
例如,假设你有这个类:
class Widget { public void DoSomething() { WidgetCalculator calculator = new WidgetCalculator(); int someValue = calculator.calculate(); // and so on... } }
在这个设置中,Widget
依赖于 WidgetCalculator
。它是一个 Widget
"与之共事" 的对象,或者更准确地说,是一个 Widget
需要为了执行自己的工作而需要的对象。上面的代码可以完成这个工作,但是它会导致紧密的耦合。比如你不能轻易地替换一个不同的 WidgetCalculator
的实现,一个类中的改动可能会破坏其他类等。
这就是依赖倒置原则的用处。不需要创建一个 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... } }
有各种各样的方式可以提供依赖项,但核心原则是对象需要提供所需的依赖关系,而不是寻找依赖关系本身。