可能重复:
How exactly does dependency injection reduce coupling?
依赖注入作为一个概念,我认为,封装了松耦合。说它有助于实现松散耦合是否正确?根据我的理解,如果你设计了一个松散耦合的类,那么你可以在它上面实现DI。如果我错了,请帮助我理解并纠正我。
答案 0 :(得分:3)
正如@maba建议的那样,这个网站上有很多相关材料。
但无论如何:是的,你是对的。你总是可以自己实现DI,但这通常是太复杂的任务。因为如果你想保持简单,你会遇到“依赖携带”的问题以及许多其他问题。
快速浏览Guice,Spring,Pico ;-)它们都经过了良好的测试和功能齐全。祝你好运。
答案 1 :(得分:2)
我想说松散耦合本质上与DI无关。如果需要,可以在具有完全紧耦合的项目上使用DI。
松耦合是将一个组件与另一个组件的实现细节隔离开来。它通常在java中通过提供协作者作为接口的实例而不是具体的类来实现。
我要说的是,在许多情况下,DI往往会引导人们使用松散耦合的代码,但它并没有强迫它们使用它(尽管在某些产品中像spring一样,不使用接口有很多缺点)。容器也支持连接松散耦合的协作者。这个例子在DI容器中非常精细,同时紧密耦合。
public class FooService { ... }
public class SomeOtherService {
public SomeOtherService(FooService fooService) {
this.fooService = fooService;
}
}
然而,这是松耦合的,因为“SomeOtherService”与接口绑定。
public interface FooService { ... }
public class SomeOtherService {
public SomeOtherService(FooService fooService) {
this.fooService = fooService;
}
}
插入你最喜欢的布线机制(guice,spring annotations,spring xml,java cdi),但概念是一样的。
维基百科有一篇关于松散耦合的好文章:
答案 2 :(得分:0)
是的,DI有助于实现松散耦合,因为无论您需要任何组件或服务的对象,您都可以通过它的超级接口类型自动装配它。根据您将在应用程序上下文文件或类中指定的类的类型,您将使用@Component,@ Service或@Reposirory进行注释,注入的实际对象的类型将在运行时决定。