Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解java中的DI_Java_Spring_Dependency Injection_Coding Style - Fatal编程技术网

理解java中的DI

理解java中的DI,java,spring,dependency-injection,coding-style,Java,Spring,Dependency Injection,Coding Style,可能重复: 我已经阅读了几篇算术文章,并与几位专业人士就DI进行了交谈。我不明白的是,如何去耦合对象。下面的文章还描述了一个场景,但我不明白Spring如何帮助卸载Payroll应用程序?解耦是通过多态性而不是DI完成的。DI肯定还有其他用途 提示和参考就行了。感谢依赖项注入将对象解耦,因为您没有直接实例化具体的类,Spring正在为您做这件事。使用DI的另一种方法是,通常创建对接口的引用,但仍然必须直接实例化对象。代码中仍然引用了concreate类 编辑:忘了提到您可以使用工厂模式将实现

可能重复:

我已经阅读了几篇算术文章,并与几位专业人士就DI进行了交谈。我不明白的是,如何去耦合对象。下面的文章还描述了一个场景,但我不明白Spring如何帮助卸载Payroll应用程序?解耦是通过多态性而不是DI完成的。DI肯定还有其他用途


提示和参考就行了。感谢

依赖项注入将对象解耦,因为您没有直接实例化具体的类,Spring正在为您做这件事。使用DI的另一种方法是,通常创建对接口的引用,但仍然必须直接实例化对象。代码中仍然引用了concreate类


编辑:忘了提到您可以使用工厂模式将实现从代码中移除,但是您只是将其移动到工厂中。Spring就像一个巨大的通用工厂,包含所有的bean。

解耦不是一个全有或全无的概念。在本文中,仅使用多态性(“Design 2”)在一定程度上解耦了对象,但是在编译PayrollApplication时,PayrollApplication类仍然必须了解Employee实现

员工实现是PayrollApplication的依赖项,通过依赖项注入,您可以实现更高级别的解耦:您可以编译PayrollApplication,使其仅引用员工接口,并仅在以后提供员工实现(可能由其他团队/组织编写)

另请查看关于依赖项注入的信息:

依赖项注入模式的主要目的是允许 在给定依赖项的多个实现中进行选择 在运行时,或通过配置文件,而不是在 编译时。该模式对于提供存根特别有用 测试时测试复杂组件的实现,但通常 用于定位插件组件,或定位和初始化 软件服务


我的论点是,我不明白DI是如何负责解耦的。以前需要的对象现在也需要了!解耦是在设计中执行的,DI与此无关。您可以在引用具体实现的对象上使用DI,而不会有任何解耦。当您使依赖于抽象类或接口时,您可以解耦不同的bean,这允许您轻松地切换不同的impl。DI容器可以帮您省去查找每个bean的不同实例并将它们注入所需bean所需的所有麻烦。您引用的文章是解释依赖注入的一个非常糟糕的例子。您看不到依赖注入和服务位置之间的区别,也没有解释控制反转和依赖反转原则。您不是在解释DI,而是在解释控制反转。