开篇
Component
是dagger完成注入流程的组织者和协调者,依赖诉求方通过@Inject
表达注入诉求后,Component
负责调用"生产车间"生产实例,然后调用成员注入器完成对诉求方的注入。
生成Component
@Component
标注一个接口,dagger会自动生成对应的实现类,接口的命名一般为依赖注入需求方 + Component后缀
。当Coponent
可为多个诉求方提供注入服务时,Component
可命名为公共功能名 + Component后缀
。回顾下上篇文章中的示例:
SuperMarket
为依赖注入需求方,请求dagger注入一个Apple实例。
public class SuperMarket {
@Inject
protected Apple apple;
public SuperMarket() {
}
}
Apple为依赖提供方,直接把构造器作为Apple实例的"生产车间"(通过为构造器标注@Inject),”生产车间“还可以通过”@Providers“实现,关于Providers
的介绍见下一篇文章。
public class Apple {
@Inject
public Apple() {
}
}
定义接口SuperMarketComponent
,用@Component
标注它,然后定义一个触发注入过程的方法,其名字随意,有且只有一个参数,类型为依赖注入需求方。
@Component
public interface SuperMarketComponent {
void injectFor(SuperMarket superMarket);
}
编译一下,看dagger做了什么。
dagger为我们生成了SuperMarketComponent接口的实现类,命名方式是直接在接口名前添加Dagger前缀。
public final class DaggerSuperMarketComponent implements SuperMarketComponent {
private DaggerSuperMarketComponent() {
}
public static Builder builder() {
return new Builder();
}
public static SuperMarketComponent create() {
return new Builder().build();
}
@Override
public void injectFor(SuperMarket superMarket) {
injectSuperMarket(superMarket);
}
private SuperMarket injectSuperMarket(SuperMarket instance) {
SuperMarket_MembersInjector.injectApple(instance, new Apple());
return instance;
}
public static final class Builder {
private Builder() {
}
public SuperMarketComponent build() {
return new DaggerSuperMarketComponent();
}
}
}
dagger为我们实现了injectFor(SuperMarket superMarket)
方法,其实现直接调用injectSuperMarket(SuperMarket instance)
方法。在injectSuperMarket(SuperMarket instance)
内,直接调用Apple的构造方法创建Apple实例,并调用SuperMarket
的成员注入器的静态注入方法injectApple(SuperMarket instance, Apple apple)将Apple实例注入到SuperMarket
的Field(apple)中。