Spring 实施驱动的好处&;依赖注入与维护实现的成本

Spring 实施驱动的好处&;依赖注入与维护实现的成本,spring,dependency-injection,guice,picocontainer,Spring,Dependency Injection,Guice,Picocontainer,我正在启动一个我想快速构建的应用程序,稍后将由20多名开发人员开发 在一个有多个开发人员的环境中,如果您了解DI的相关知识,您会选择DI来开发一个您希望相对快速构建的新应用程序吗 对我来说,现在使用DI的代价是编写和生成代码行,而不是对每个对象都使用接口。接下来,我希望DI不会因为反射而成为性能问题 DI基本上与框架无关。例如,如果您只是将依赖项作为参数添加到constrator中,那么您正在执行DI。实际上,您甚至不需要创建接口(尽管这将有助于测试。稍后介绍接口是Java等语言中的一个简单重构

我正在启动一个我想快速构建的应用程序,稍后将由20多名开发人员开发

在一个有多个开发人员的环境中,如果您了解DI的相关知识,您会选择DI来开发一个您希望相对快速构建的新应用程序吗


对我来说,现在使用DI的代价是编写和生成代码行,而不是对每个对象都使用接口。接下来,我希望DI不会因为反射而成为性能问题

DI基本上与框架无关。例如,如果您只是将依赖项作为参数添加到constrator中,那么您正在执行DI。实际上,您甚至不需要创建接口(尽管这将有助于测试。稍后介绍接口是Java等语言中的一个简单重构)。DI只是解除了类用户的创建责任

我脑子里最大的代价就是改变主意。学会思考。
好处包括更容易测试。关注点和更多的分离。

我肯定会提倡DI,特别是当有很多开发人员的时候

这允许每个开发人员编写和测试他们自己的代码,而不依赖于在他们控制之外开发的注入组件


它还可以简化接口定义,让每个人都知道哪些组件可以提供哪些功能。

简单地说,没有依赖注入进行面向对象的开发是不好的。非常糟糕。在我看来,依赖注入是人们熟知的OO开发的根源:关注点分离、独立组件之间的松散耦合、分层编码,所有这些都是使用DI完成的。而且,它使测试变得非常简单,并允许使用TDD、mocking(BDD)等技术

正如释迦牟尼在回答中所说,DI与您使用的框架无关。Spring并没有发明DI,它只是提出了一个解决方案来实现它。所以,如果你最初的问题是“我们是否应该使用Spring”,那么我会说这是一个个人品味的问题。如果你自己做,你可以达到完全相同的结果。我曾经在有或没有容器(Spring、pico等)的项目中工作过,它们都有各自的优点和缺点。不过,我个人的偏好是不使用任何一种工具,而是自己管理DI

这是DI:

// constructor
public MyClass(MyDependencyInterface injected) {
    this.dependency = injected;
}
或者:

// setter injection
public void setDependency(MyDependencyInterface injected) {
    this.dependency = injected;
}
接下来,我希望DI不会因为反射而成为性能问题


不知道你说的是什么意思。DI不需要反射。

Java的基本问题是,当您在类A中执行A
new B()
时,这意味着类A在字节码级别与类B紧密绑定

这通常是一件好事,因为这意味着生成的应用程序变得非常坚固,因为所有的“砖块”都很好地“粘合在一起”

然而,您经常需要推迟一些设计问题以部署时间(有时甚至是运行时),而在Java中处理这一问题的方法传统上是委托给一个工厂,而这个工厂甚至可能反过来委托给另一个工厂等等,直到您做出决定为止。这通常是通过一个属性文件来完成的,该属性文件包含与代码中的
if
-语句相对应的标志(这要求程序员在编写代码时预见所有情况),或者使用
class.forName()
解析的类名(这是脆弱的,因为编译器无法帮助)

依赖注入的优点是,您可以通过将在自己的代码之外创建适当对象的责任委托给容器(但也可以是一个神)来避开
操作符的硬绑定。您可以创建一些非常清晰的线条,在这些线条中,您可以将东西放在一起,对于那些提供代码配置的DI框架(如Guice),结果可以是坚固的,也可以是模块化的


请注意,对接口进行编码可以更容易地确定切割线的正确位置,因为接口的使用通常对应于注入点。

没有接口,类与其依赖项之间会保持紧密耦合,这是DI试图打破的一件事。那真是太遗憾了。只是要指出的是,对于快速扣球,接口决策可以推迟