在注入的时候需要Component,inject方法需要将被注入的对象传进来,一般都是activity,然后component就会把数据注入给传进来的对象。
例如Component是C,activity是A,A中有个对象需要被注入,对象为D,需要注入的对象要用@Inject注解,C注入对象需要Module,叫它M。M的类声明外要加@Module。
首先要初始化C,在C的类声明外要加上
供,这里有一个有意思的东西就是M也可以为PM提供数据,例如PC需要为PA inject一个String数据,数据是PM提供
的,假设
由方法PMethod提供。
@Component(
modules = {
Module.class,
}
)
这几行代码,modules=一个类数组,标示这C可以用那些类实例化,实例化只是M的一部分用途,后面还有其他的,初
始化方法为
DaggerComonpent.builder().module(new Module()).build();
DaggerComonpent类不是我们创建的,是这个框架帮我创建的,命名规则为Dagger+C,module方法是C对应的M的
首字母小写。这样C就被创建出来了。C是接口,DaggerC是Dagger帮我们创建的接口实现类。
C和M除了初始化还有数据的关系,C种要提供给A的数据是从M中来的,例如A种有个String对象加了@Inject注解,
那在M种就要提供一个返回值是String的方法,用@Provides注解,该方法返回一个String,A中的String实际
M提供的,但是如果A中有多个同类型的Inject,要怎么和M一一对应,通过@Name("name")注解,name一致。
因为初始化C需要的类DaggerC是Dagger帮我们创建的,所以开始会报错,需要运行一遍才可以,C也可以实例
子C,在C种添加一个方法,例如叫plus
AnotherC plus(Another M);C和M是通过C类声明前的注解关联的,但是如果用这种方式实例化C,C的注解需要
改变一下
@SubComponent(例如用C的plus方法实例PC,对应的M叫PM。前面说过数据是M提供的,如果是用C实例的PC,那么PC的数据要由PM提
modules = {
AnotherM.class,
}
)
意思是子Component的意思。
这样就可以通过其他C的plus方法实例了。
供,这里有一个有意思的东西就是M也可以为PM提供数据,例如PC需要为PA inject一个String数据,数据是PM提供
的,假设
由方法PMethod提供。
@Provides
String PMethod(String string) {
return string;
}
可以看出数据虽然是PM提供的,但是方法是需要参数的,这样是运行不起来的,但是如果M中有一个方法
@Provides
String Method(String string) {
return string;
}
那么MC注入的数据就会是M中的这个方法返回的。
还有,如果一个C,注解里可以写多个M,例如M1和M2,那么M1和M2是可以互相传递参数的,就像M给PM提供数据一样
参数的对应关系:如果M中提供一个方法
@Provides
AAAA bbb(@Named("Data") File cacheDir) {
...........
}
AAAA bbb(@Named("Data") File cacheDir) {
...........
}
@Provides
@Named("Data")
File ccc(){
return new File("....");
}
@Named("Data")
File ccc(){
return new File("....");
}
可以自己定义@Scope
@ViolationScope
@Subcomponent(
modules = {
Module.class
}
)
@Subcomponent(
modules = {
Module.class
}
)
在M中提供的实例会跟对应的Component生命周期一致
@Provides @ViolationScope CarInfo provideCarInfo() { return carInfo; }
原文链接:https://www.f2er.com/javaschema/284086.html