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

时间:2011-10-18 09:38:32

标签: spring dependency-injection guice picocontainer

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

在具有多个开发人员的环境中了解您对DI的了解,您是否会使用DI来寻找您想要相对快速构建的新应用程序?

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

4 个答案:

答案 0 :(得分:2)

DI基本上不是关于框架。如果您只是将您的依赖项添加为缩限器的参数,那么您正在进行DI。实际上你甚至不需要创建接口(虽然这有助于测试。稍后介绍接口是一种简单的Java语言重构)。 DI只是从班级用户那里删除了创作的责任。

我头脑中最大的代价就是改变主意。要学会思考DI。 好处包括更容易测试。分离关注等等。

答案 1 :(得分:1)

简单地说,在没有依赖注入的情况下进行面向对象的开发是不好的。很坏。在我看来,依赖注入是公认的OO开发的根源:关注点的分离,独立组件之间的松散耦合,层次编码,所有这些都是使用DI完成的。而且,它使测试变得非常容易,并允许TDD,模拟(BDD)等技术。

正如Shakyamuni在回答中所说,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不需要反射。

答案 2 :(得分:0)

我肯定会提倡DI,特别是当有很多开发者时。

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

它还可以促进界面定义,以便每个人都知道哪些组件可用的功能。

答案 3 :(得分:0)

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

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

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

依赖注入的优点是你可以通过委派责任在你自己的代码之外创建一个合适的对象来回避new运算符的硬绑定(对于一个容器,但也可以是一个神)。您可以创建一些非常清晰的切割线,您可以将这些切割线放在一起,对于那些提供代码配置的DI框架(如Guice),结果可以是坚固的,也可以是模块化的。

请注意,对界面进行编码可以更容易地识别切割线切口的正确位置,因为界面用法通常对应于注射点。