为什么我们需要Spring框架?[已关闭]

2022-09-02 10:34:17

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

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

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插件的事实已经足够明显,以至于我们可能首先创建不必要的东西,不是吗?


答案 1

在“旧时代”中,代码是像第一个示例一样编写的。

春天一个图书馆,你说这是“过去”完成的方式之一。

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

什么是“这么多其他东西”?春天是隔离的;你只能带你需要的东西。

为什么忽略通过注释进行的配置?

目的是使用通用的、本地化的、已知的标准机制。说“几十年前,每个程序都使用依赖注入”是荒谬的。几十年前,我在相当广泛的语言领域进行了编程,虽然我们做了类似的事情,但我们都有自己的实现,具有不同程度的复杂程度,并且成功程度大不相同。

弹簧对于DI/ IoC是必要的吗?不,许多其他DI框架证明了这一点。这是一种众所周知的,基本上是标准的做事方式吗?是的。


答案 2

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

如果你喜欢DI,但更喜欢在代码中进行连接:使用Google Guice。

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

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

如果你不喜欢DI,那么...问另一个问题。

同一原则有多个实现是件好事。


推荐