提到依赖注入,大多数人想到的就是spring,然后就是IOC控制反转,然后依赖注入。其实依赖注入的概念很简单,就是一个对象需要依赖另一个对象才能完全正常工作。而实现这种做法最简单的方式就是通过构造器注入一个需要依赖的类。
从Effective Java书中看到的一个例子
一个拼写检查器需要依赖词典。可以将检查器写成一个静态工具类:
或者也可以写成单例的
以上这么写最大的问题在于,字典只有一个,并不能根据不同的词语来实现不同词典的检查,虽然你可以提供一个方法来修改里面的词典,但是你必须手动的去调用修改方法。这样做显得很笨拙,所以静态工具类和Singleton类不适合于需要引用底层资源的类。
如果我们把词典的接口写在了检查器的构造方法里,每个检查器的实例化都要显式的传入对应的词典,这是依赖注入的一种形式:词典是拼写检查器的一个依赖(dependency),再创建拼写检查器时就必须将词典注入(injection)其中。
例如这样
/**
* 词典借口
* @author zhy
* @date 2021/2/2319:01
*/
public interface Dictionary {
//...对应方法
}
/**
* 拼写检查器
* @author zhy
* @date 2021/2/2319:02
*/
public class SpellChecker {
private final Dictionary dictionary;
public SpellChecker(Dictionary dictionary){
this.dictionary = dictionary;
}
public boolean isValid(String word){
return true;
}
public List<String> suggestions(String typo){
return Collections.emptyList();
}
}
这就是一个依赖注入的模式!