Dagger需要注入依赖的地方,需要@Inject的注解,共有三种inject方式:Identifies injectable constructors, methods, and fields.
constructors首先被注入,然后是method和field,父类中的method和field会先于子类中的method和field注入,同一个类中的fields和methods注入注入不分先后。当类中含有@Inject注释的成员变量, 却没有@Inject注释的构造函数时, Dagger将使用类的默认构造函数。若类中缺少@Inject注释, 该类是不能由Dagger创建的。
1、Constructors
在构造方法添加@Inject注解,指明Constructor的参数需要dependency,这些参数可以被使用在private或final字段。需要指出的是一个类只能有一个构造方法可以被inject,否则会报:Error: Types may only contain one @Inject constructor.
2、Methods
在成员方法添加@Inject注解,成员方法不可以是抽象的,指明方法参数需要依赖。一般会这样用:inject(this)。
3、Fields
在成员变量上加@Inject,不可以是private或者是final字段。
@Provides 提供的依赖如果没有提供给子图,只注入一个对象实例,建议直接new一个对象出来,将其它已生成的依赖传入。如果直接将依赖对象当做参数传进来,会生成对应的工厂方法,增加程序运行成本。
例如:
注: Generating a MembersInjector or Factory for ElectricHeater. Prefer to run the dagger processor over that class instead.
@Provides Heater provideHeater(ElectricHeater electricHeater) {
return electricHeater;
}
@Provides Heater provideHeater() {
return new ElectricHeater();
}