《Effective Java》的第五条,提到了优先使用依赖注入的观点。刚好最近在学Spring,就顺便来谈谈我的认识。
先说书上的例子,拼写检查器为例,最初的代码大概是这样的:
public class SpellChecker {
Directory directory = ...
//一些检查语法词法的方法
...
}
此时问题来了,这个拼写检查器的类是依赖字典的,但是这个类只有一种字典可以用。这显然是不行的,使用过word的人都知道,word会实时的进行拼写检查,而且拼写检查的字典可以选择,我们姑且认为word有一个很智能的线程,这个线程检测你键入的是拉丁字母还是汉字,如果是汉字,则用汉语词典进行检查,如果是拉丁字母,则利用英文词典进行检查。
下面来一段功能代码:
public class SpellChecker {
Directory directory;
//构造器
public SpellChecker(Directory directoty) {
this.directory = directory;
}
//检查的方法
...
}
这个时候,当检查线程发现了键入汉字的时候,会将《现代汉语词典》作为依赖注入到拼写检查类里,就像这样:
SpellChecker spellChecker = new SpellChecker(现代汉语词典);
如果发现键入了拉丁字母,则用《牛津词典》去新建对象就可以。这样一来,类并不需要去做额外的新建对象的操作,一切都那么自然,就像我刚才举得例子一样。
设想一下,如果我们写一个拼写检查类,没有利用依赖注入,而是交给类自己去初始化对象,那么将是怎么样一个画面?
首先我会设计一个接口SpellChecker,然后EnglishSpellChecker,ChineseSpellChecker等等去实现这个接口,每个类里都会新建一个字典对象以实现功能。
显然这种办法太丑陋了,世界上有几百几千种语言,就要搞多少类,如果依赖复杂一点,是一种组合关系,那么要实现的类数量就更庞大的,不敢想象的画面。
Spring的核心思想之一就是依赖注入(DI),这种方式也是符合《Effective Java》这本书的思想的。
学而不思则罔。
网友评论