- 解析表面意思:什么是依赖?可以简单地理解为import引入操作,比如import com.xxx.xxx;什么是注入?可以简单地理解为方法传参,就像给方法A(int temp)传入参数20;依赖注入可以理解为把原本要用import引入的资源,通过方法传参的形式引入,进而实现动态的决定要使用何种资源。这里也可以叫控制反转,就是把决定何种资源的控制权交由外部的使用者决定,也就是调用A(int temp)方法去决定。
其实这里的依赖,不一定是import引入,也可以是对某个对象的引用,比如类A里会用到类B的实例,那么你可能会在类A里去构建一个类B的实例,而依赖注入就是把构建类B的操作通过一个API(容器)对外开发,让外部的使用者去做构建操作,它只要给传一个类B的实例给到类A就可以了。
依赖注入的适用场景之一:当一个类依赖到一个或多个底层资源并且会受到资源影响的时候,使用依赖注入代替直接依赖。否则,当某个底层资源需要移除时,或者需要增加新的资源时,你就不得不修改这个类,这违背“开闭原则”。
举一个例子:
现在有个需求,需要将用户输入的英文内容转化为翻译的其他语言,假设已经引入或创建好多门语言的词典查询类,我可以起个翻译类:
public class LanguageTranslateHelper {
private static final ChineseWords chineseWords;
private static final JapaneseWords japaneseWords;
...
private LanguageTranslateHelper() {}
public static String transToChinese(String enStr) {
chineseWords = new ChineseWords(...);
return chineseWords.trans(enStr);
}
public static String transToJapanese(String enStr) {
japaneseWords = new JapaneseWords(...);
return japaneseWords.trans(enStr);
}
...
}
使用依赖注入实现:
实现一,假如底层语言库是通过第三方引入的:
public class LanguageTranslateHelper {
private LanguageTranslateHelper() {}
public static String transToChinese(String enStr, @NotNull ChineseWords chineseWords) {
return chineseWords.trans(enStr);
}
public static String transToJapanese(String enStr, @NotNull JapaneseWords japaneseWords) {
return japaneseWords.trans(enStr);
}
...
}
实现二,假如底层语言库是自己实现的:
//定义一个接口,ChineseWords JapaneseWords都实现了这个接口
public interface ITranslate {
String translate(String enStr);
}
public class LanguageTranslateHelper {
private static final ITranslate words;
...
private LanguageTranslateHelper() {}
public static String transToChinese(String enStr, @NotNull ITranslate words) {
return words.trans(enStr);
}
...
}