Code example
class Tiger {
public void sleep() {
System.out.println("Tiger sleeping");
}
}
// 为注射器提供工厂类
// @Module: 表示Dagger2可以将该类当作对象工厂.
@Module
class ZooModule {
// @Provides: 表示Dagger2可以调用providerTiger()方法为注射器提供对象.
@Provides
public Tiger providerTiger() {
return new Tiger();
}
// Tips: 如果当前工厂或者其他工厂为同一个注射器提供相同的对象,编译的时候会提示重复绑定的错误.
// [Dagger/DuplicateBindings]
@Provides
public Tiger providerTiger2() {
return new Tiger();
}
}
// 对象使用者
public class Zoo {
// @Inject: 该注解用于成员变量上代表注射器可以为该成员变量赋值对象.
@Inject
Tiger tiger;
@Test
public void 案例三() {
DaggerZooComponent.create().inject(this);
tiger.sleep();
}
}
// 注射器
// @Component: 该注解是用来创造对象提供方和对象使用间的桥梁,如何将对象赋值给成员变量都是由它来做的.
// (modules = {ZooModule.class}): 表示该注射器可以使用ZooModule对象工厂提供方法.
@Component(modules = {
ZooModule.class})
interface ZooComponent {
Zoo inject(Zoo zoo);
}
Dagger2 generated code reading
The main analysis is
@Module
that the@Provides
annotation is used for the syringe as the target factory.
Looking at the code generated by Degger2 based on the above case, the generated code is in the build\generated\sources\annotationProcessor\..
folder.
DaggerZooComponent.create()
create()
Used to generateDaggerZooComponent
objects,DaggerZooComponent
the parent class is theZooComponent
interface, which overrides theinject()
methods in the interface .
final class DaggerZooComponent implements ZooComponent {
private final ZooModule zooModule;
// 由Builder.build()创建DaggerZooComponent对象.
private DaggerZooComponent(ZooModule zooModuleParam) {
this.zooModule = zooModuleParam;
}
// create()方法创建DaggerZooComponent()对象
public static ZooComponent create() {
return new Builder().build();
}
static final class Builder {
private ZooModule zooModule;
private Builder() {
}
// build()方法返回DaggerZooComponent对象.
public ZooComponent build() {
// 如果zooModule为null,那么就创建该对象.ZooModule代表工厂.
if (zooModule == null) {
this.zooModule = new ZooModule();
}
// 将ZooModule工厂对象存储在DaggerZooComponent对象中
return new DaggerZooComponent(zooModule);
}
}
}
.inject(this)
Object injection
UseDaggerZooComponent
objects to inject theDagger2
createdTiger
objects intoZoo
it.
final class DaggerZooComponent implements ZooComponent {
// 接口中的方法,由DaggerZooComponent实现,该方法就是用来向Zoo对象中注入Tiger对象的.
@Override
public Zoo inject(Zoo zoo) {
// zoo就是inject(this)中的this了,代表Zoo对象.
return injectZoo(zoo);
}
private Zoo injectZoo(Zoo instance) {
// 1. ZooModule_ProviderTigerFactory.providerTiger(zooModule): 通过ZooModule工厂获取Zoo需要的对象.
// 2. Zoo_MembersInjector.injectTiger(instance, ZooModule_ProviderTigerFactory.providerTiger(zooModule)): 这里就是为Zoo对象中所需字段赋值.
Zoo_MembersInjector.injectTiger(instance, ZooModule_ProviderTigerFactory.providerTiger(zooModule));
return instance;
}
}
ZooModule_ProviderTigerFactory.providerTiger(zooModule)
As mentioned above,ZooModule
it is actually a factory, which is specially used toDagger2
provide objects.You can seeZooModule
the operations of providing objects below .
public final class ZooModule_ProviderTigerFactory implements Factory<Tiger> {
public static Tiger providerTiger(ZooModule instance) {
// providerTiger()为用户在ZooModule类中写的方法,返回一个Tiger对象.
// Preconditions.checkNotNull() 该方法最终将Tiger对象返回
return Preconditions.checkNotNull(instance.providerTiger(), "Cannot return null from a non-@Nullable @Provides method");
}
}
Zoo_MembersInjector.injectTiger(instance, ZooModule_ProviderTigerFactory.providerTiger(zooModule))
This methodZoo
assigns values to the required fields ininstance
theZoo
object, for the object, itZooModule_ProviderTigerFactory.providerTiger(zooModule)
will return theTiger
object.
public final class Zoo_MembersInjector implements MembersInjector<Zoo> {
@InjectedFieldSignature("com.yey.dagger2.Zoo.tiger")
public static void injectTiger(Zoo instance, Object tiger) {
// 此处就是为zoo.tiger字段赋值的操作.
instance.tiger = (Tiger) tiger;
}
}