控制反转(IOC)
如果一个类A 的功能实现需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合,一旦类B出现了问题,类A也需要进行改造,如果这样的情况较多,每个类之间都有很多依赖,那么就会出现牵一发而动全身的情况,程序会极难维护,并且很容易出现问题。要解决这个问题,就要把A类对B类的控制权抽离出来,交给一个第三方去做,把控制权反转给第三方,就称作控制反转(IOC Inversion Of Control)。控制反转是一种思想,是能够解决问题的一种可能的结果,而依赖注入(Dependency Injection)就是其最典型的实现方法。由第三方(我们称作IOC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A内,这样就极大程度的对类A和类B进行了解耦。
依赖注入(DI)
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
依赖注入的使用场景
一个类里有两个变量,这两个变量就是它的依赖:
public class People {
private String name;
private int age;
}
要初始化一个依赖,有两种方法:第一,你这个类自己初始化:
public People() {
this.name = "tom";
this.age = 12;
}
另外一个就是通过外部初始化:
public People(String name, int age) {
this.name = name;
this.age = age;
}
其中这第二种,让外部帮你初始化People类的依赖,就叫依赖注入。关键在于初始化是谁做的,至于最后一步是把结果拿过来,还是说连拿都不用拿,最后一步的赋值工作直接通过set方法设置,这都不重要,只要初始化工作是外部做的,就都叫依赖注入。
所以通过带参数的构造方法new对象,通过Factory或者Builder直接获得想要的对象都是依赖注入
Public class PeopleFactory{
public static People getChinesePeople() {
People ChinesePeople = new People();
ChinesePeople.setName("张三");
ChinesePeople.setAge(20);
}
}
class PeopleBuilder{
private String name;
private int age;
public void name(String name) {
this.name = name;
}
pulbic void age(int age) {
this.age = age;
}
public People build(){
return new People(name, age);
}
}
Hilt
Hilt是基于 Dagger实现的自动化依赖注入工具,Hilt 会自动找到 Android 的系统组件里面那些最佳的初始化位置——比如 Activity 的 onCreate()
,然后在这些位置注入依赖,所以Hilt是Dagger基于android场景化的产物。
Hilt引入
首先,将 hilt-android-gradle-plugin
插件添加到项目的根级 build.gradle
文件中: