20

嗨,我是 String 新手,正在阅读 Martin Fowler 的文章:http ://martinfowler.com/articles/injection.html

他给出了一个使用 MovieFinder 来查找电影的 MovieLister 示例。在这个例子中,他首先提供了代码:

class MovieLister...
    private MovieFinder finder;
    public MovieLister() {
        finder = new ColonDelimitedMovieFinder("movies1.txt");
    }
}

他指出,你不能将 MovieLister 提供给你的朋友重复使用,除非你的朋友使用相同的 MovieFinder 实现并将电影放在同一个 txt 文件中。

是的,当然,这不是您编写组件并希望有人可以重用它的方式。相反,随着他的进步,你应该写:

class MovieLister...
    public MovieLister(MovieFinder finder) {
        this.finder = finder;       
    }
}

是的,这样更好。现在您的朋友可以接管您的 MovieLister 并插入他自己的代码。对我来说,故事是完整的。我错过了为什么你需要一个 Spring 框架来注入依赖项。通过您朋友的代码将依赖项注入到 MovieLister。句号。所有 Spring 设置等价于简单地实现 MovieFinder 接口并进行这样的调用:

MovieFinder myMovieFinder = new MyMovieFinderImpl();
MovieLister myMovieLister = new MovieLister(myMovieFinder);

简单,轻松。我知道您在代码中对 MyMovieFinderImpl 实例的创建进行了硬编码。但是,将它转移到 XML 中并带来这么多其他东西有什么意义呢?从什么时候程序员变得如此害怕编译代码并更喜欢在不编译的情况下更改 XML 来完成所有工作?我很抱歉,但我想我只是错过了重点。几十年前,每个程序都使用依赖注入。但在过去,依赖是由程序使用库、DOS 命令行或 GUI 注入的。为什么现在我们需要另一种方式来注入依赖?

谢谢你。

更新:

好吧,你们中的许多人都提出了注释。在我对 Spring 的浅薄理解中,我可能觉得使用 XML 比使用注解更舒服。至少有一个中心位置以更容易理解的方式列出依赖关系。有了注释,就没有这样的中心位置。相反,只是魔术发生了。想知道传入的参数是什么?自己去弄清楚,祝你好运。是的,我知道有智能 IDE 插件可以帮助浏览代码。但是,为什么我们一开始就让一件事情变得复杂,然后庆祝另一件让我们的生活更轻松的事情呢?注释使代码更难浏览和理解,因此人们为此创建 IDE 插件这一事实是显而易见的,以至于我们可能会首先创建不必要的东西,不是吗?

4

3 回答 3

9

在“旧时代”中,代码​​的编写方式与第一个示例相同。

Spring一个图书馆,你说这是“过去”的一种方式。

很少在命令行或通过 GUI 指定实现。不需要多次实现相同功能,因为 (a) 系统很少像现在这样复杂,(b) 他们不需要像今天那样与其他系统进行互操作,以及 (c) 深度测试的实施频率要低得多。

什么是“这么多其他东西”?弹簧是隔离的;你可以只带来你需要的东西。

为什么你忽略了通过注解的配置?

目的是使用通用的、本地化的、已知的标准机制。说“几十年前每个程序都使用依赖注入”是可笑的。几十年前我编程过,跨越了相当广泛的语言,虽然我们做了类似的事情,但我们都有自己的实现,具有不同程度的复杂性,以及不同程度的成功。

DI/IoC需要Spring吗?不,许多其他 DI 框架证明了这一点。这是一种众所周知的、本质上标准的方式吗?是的。

于 2012-12-16T00:01:28.260 回答
7

不要将原理 (DI) 与一种实现 (Spring) 混淆。

如果您喜欢 DI,但更喜欢在代码中进行布线:使用 Google Guice。

如果您喜欢 DI,但更喜欢在您的代码可选的 XML 中进行连接,那么请使用 CDI(来自 Java EE 的事物轨道)。

如果您喜欢 DI 并且喜欢 XML(或者必须通过重新配置来改变应用程序的行为),那么只需使用 Spring。

如果您不喜欢 DI,那么……再问一个问题。

最好有几个相同原理的实现。

于 2012-12-16T00:01:14.060 回答
2

是的,如果你只有两个类,手动进行“依赖注入”会更简单、更容易。但是如果你有很多类,如果一个框架(例如 Spring)为你找到正确的初始化和注入顺序,它会更容易和更灵活。

顺便说一句,在最近的 Spring 版本中,您不需要(太多)弄乱 XML,您可以使用注释声明依赖项。

于 2012-12-16T00:06:29.610 回答