Java之优先使用依赖注入

作者: 有财君 | 来源:发表于2019-04-29 22:33 被阅读7次

    《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》这本书的思想的。

    学而不思则罔。

    相关文章

      网友评论

        本文标题:Java之优先使用依赖注入

        本文链接:https://www.haomeiwen.com/subject/pccpnqtx.html