依赖注入其实是个很容易理解,类似于设计模式中UML类图,其中有个聚类的关系,如下代码,我们只需要声名一个Lexicon接口,规范其中的一些方法, 剩下的都交给客户端去做。这就是依赖注入的意义。

    1. // Dependency injection provides flexibility and testability
    2. public class SpellChecker {
    3. private final Lexicon dictionary;
    4. public SpellChecker(Lexicon dictionary) {
    5. this.dictionary = Objects.requireNonNull(dictionary);
    6. }
    7. public boolean isValid(String word) { ... }
    8. public List<String> suggestions(String typo) { ... }
    9. }

    Spring架构中依赖注入也是这个意思,Spring的依赖注入最常用的就是构造器注入,getter,setter注入。上面的代码就是构造器注入。下面的代码就是getter,setter注入。

    1. // Dependency injection provides flexibility and testability
    2. public class SpellChecker {
    3. private final Lexicon dictionary;
    4. public void setDictionary(Lexicon dictionary){
    5. this.dictionary = dictionary;
    6. }
    7. public Lexicon getDictionary(){
    8. return this.dictionary;
    9. }
    10. public boolean isValid(String word) { ... }
    11. public List<String> suggestions(String typo) { ... }
    12. }

    当然上面的代码直接将要注入的实例注入到代码中,也可以使用工厂代替实例,这样更加灵活,提高可用性。
    总结:所谓的依赖注入就是使用聚合的方式降低类之间的耦合度,最常用的就是构造器注入,getter,setter注入。同时应该用工厂代替实例注入,这样更加灵活