依赖注入其实是个很容易理解,类似于设计模式中UML类图,其中有个聚类的关系,如下代码,我们只需要声名一个Lexicon接口,规范其中的一些方法, 剩下的都交给客户端去做。这就是依赖注入的意义。
// Dependency injection provides flexibility and testability
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
}
Spring架构中依赖注入也是这个意思,Spring的依赖注入最常用的就是构造器注入,getter,setter注入。上面的代码就是构造器注入。下面的代码就是getter,setter注入。
// Dependency injection provides flexibility and testability
public class SpellChecker {
private final Lexicon dictionary;
public void setDictionary(Lexicon dictionary){
this.dictionary = dictionary;
}
public Lexicon getDictionary(){
return this.dictionary;
}
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
}
当然上面的代码直接将要注入的实例注入到代码中,也可以使用工厂代替实例,这样更加灵活,提高可用性。
总结:所谓的依赖注入就是使用聚合的方式降低类之间的耦合度,最常用的就是构造器注入,getter,setter注入。同时应该用工厂代替实例注入,这样更加灵活