嗨,我是String的新手,正在阅读Martin Fowler撰写的文章:http://martinfowler.com/articles/injection.html
他举了一个MovieLister的例子,使用MovieFinder来寻找电影.在这个例子中,他首先提供了代码:
class MovieLister...
private MovieFinder finder;
public MovieLister() {
finder = new ColonDelimitedMovieFinder("movies1.txt");
}
}
Run Code Online (Sandbox Code Playgroud)
他指出,除非你的朋友使用相同的MovieFinder实现并将电影放在同一个txt文件中,否则你不能将MovieLister给你的朋友重复使用.
是的,当然,这不是你编写组件的方式,希望有人可以重用它.相反,随着他的进步,你应该写:
class MovieLister...
public MovieLister(MovieFinder finder) {
this.finder = finder;
}
}
Run Code Online (Sandbox Code Playgroud)
是的,那更好.现在你的朋友可以接管你的MovieLister并插入他自己的代码.对我来说,故事是完整的.我想念你为什么需要一个Spring框架来注入依赖项.依赖关系由朋友的代码注入MovieLister.完全停止.所有Spring设置等同于简单地实现MovieFinder接口并进行这样的调用:
MovieFinder myMovieFinder = new MyMovieFinderImpl();
MovieLister myMovieLister = new MovieLister(myMovieFinder);
Run Code Online (Sandbox Code Playgroud)
简单,容易.我知道你在代码中硬编码MyMovieFinderImpl实例的创建.但是将这一点转移到XML上又有什么意义呢?程序员是否因为害怕编译代码而更喜欢更改XML而不编译以完成所有工作?对不起,我想我只是错过了这一点.几十年前,每个程序都使用依赖注入.但是在过去,依赖是由程序使用库,DOS命令行或GUI注入的.为什么现在我们需要另一种方式来注入依赖?
谢谢.
更新:
好吧,你们很多人带来了注释.在我对Spring的理解中,我可能会更习惯使用XML而不是注释.至少有一个中心位置,以更容易理解的方式列出依赖关系.有了注释,没有这样的中心位置.相反,只是魔术发生.想知道传入的参数是什么?自己去弄清楚,祝你好运.是的,我知道有智能IDE插件可以帮助导航代码.但是,为什么我们首先让一件事变得复杂,并庆祝另一件让我们的生活更轻松的事情呢?事实上,注释使代码更难以浏览和理解,因此人们为此创建IDE插件是显而易见的,我们可能首先创建不必要的东西,不是吗?
在"过去的日子"中,代码是在第一个例子中编写的.
Spring 是一个图书馆,你说它是"过去"中的一种方式.
很少在命令行或GUI上指定实现.不需要经常使用相同功能的多个实现,因为(a)系统很少像现在这样复杂,(b)它们不需要像今天那样与其他系统互操作,并且(c)深测试实施的次数要少得多.
什么是"其他东西"?春天是隔离的; 你只能带来你需要的东西.
为什么通过注释忽略配置?
目的是使用通用的,本地化的,已知的标准机制.说"几十年前每个程序都使用依赖注入"是荒谬的.几十年前,我在很多语言中编程,虽然我们做了类似的事情,但我们都有自己的实现,具有不同程度的复杂性,并且成功程度各不相同.
DI/IoC 需要 Spring 吗?不,还有许多其他DI框架证明了这一点.它是一种众所周知的,基本上标准的做法吗?是的.
不要将原理(DI)与一个实现(Spring)混淆.
如果您喜欢DI,但更喜欢在代码中进行布线:使用Google Guice.
如果您喜欢DI,但更喜欢在代码和可选的XML中进行连接,那么请使用CDI(来自Java EE的事物跟踪).
如果您喜欢DI并且喜欢XML(或者必须通过重新配置来改变应用程序的行为),那么就使用Spring.
如果你不喜欢DI那么......问另一个问题.
有几个相同原理的实现是很好的.
| 归档时间: |
|
| 查看次数: |
22597 次 |
| 最近记录: |