代碼示例
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生成代碼閱讀
主要分析的是
@Module
,@Provides
註解作爲對象工廠給注射器使用.
就着上面的案例來看下Degger2生成的代碼,生成的代碼在build\generated\sources\annotationProcessor\..
文件夾中.
DaggerZooComponent.create()
create()
用來生成DaggerZooComponent
對象,DaggerZooComponent
的父類是ZooComponent
接口,它重寫了接口中的inject()
方法.
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)
對象注入
使用DaggerZooComponent
對象將Dagger2
創建的Tiger
對象注入到Zoo
中.
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)
上面講過,ZooModule
其實是工廠,專門爲Dagger2
提供對象用的,下面就能看到ZooModule
提供對象的操作.
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))
該方法爲Zoo
對象中所需字段賦值,instance
爲Zoo
對象,ZooModule_ProviderTigerFactory.providerTiger(zooModule)
將返回Tiger
對象.
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;
}
}