依赖注入其实是个很容易理解,类似于设计模式中UML类图,其中有个聚类的关系,如下代码,我们只需要声名一个Lexicon接口,规范其中的一些方法, 剩下的都交给客户端去做。这就是依赖注入的意义。
// Dependency injection provides flexibility and testabilitypublic 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 testabilitypublic 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注入。同时应该用工厂代替实例注入,这样更加灵活
