本篇文章主要介绍了"Dagger2生成代码解析",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
Dagger2生成代码解析根据一个简单的Dagger2示例程序,进行进一步的探索,对Dagger2自动生成的代码进行解析。以下解析都基于该Demo生成的类进行。...
Dagger2生成代码解析
根据一个简单的Dagger2示例程序,进行进一步的探索,对Dagger2自动生成的代码进行解析。以下解析都基于该Demo生成的类进行。
UML

DaggerActivityComponent.Builder类
作用: 生成该类的父类 (DaggerActivityComponent)
public static final class Builder {
private ActivityModule activityModule;
private Builder() {
}
/*
* 生成Component实现类
*/
public ActivityComponent build() {
if (activityModule == null) {
this.activityModule = new ActivityModule();
}
return new DaggerActivityComponent(this); //Component:被装饰的类
}
/*
* 设置Module
*/
public Builder activityModule(ActivityModule activityModule) {
if (activityModule == null) {
throw new NullPointerException("activityModule");
}
this.activityModule = activityModule;
return this;
}
}
DaggerActivityComponent
作用: 初始化Provider,MembersInjector,关联Activity和Module,进行注入
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerActivityComponent implements ActivityComponent {
private Provider provideUserModelProvider;
private MembersInjector mainActivityMembersInjector;
private DaggerActivityComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static ActivityComponent create() {
return builder().build();
}
/*
* 进行初始化
*/
private void initialize(final Builder builder) {
this.provideUserModelProvider = ActivityModule_ProvideUserModelFactory.create(builder.activityModule);
this.mainActivityMembersInjector = MainActivity_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), provideUserModelProvider);
}
/*
* 进行注入
*/
@Override
public void inject(MainActivity activity) {
mainActivityMembersInjector.injectMembers(activity);
}
public static final class Builder {
...
}
}
ActivityModule_ProvideUserModelFactory
Provides工厂,根据ActivityModule获取Person
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class ActivityModule_ProvideUserModelFactory implements Factory {
private final ActivityModule module;
public ActivityModule_ProvideUserModelFactory(ActivityModule module) {
assert module != null;
this.module = module;
}
@Override
public Person get() {
Person provided = module.provideUserModel();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory create(ActivityModule module) {
return new ActivityModule_ProvideUserModelFactory(module);
}
}
MainActivity_MembersInjector
作用:对@Inject注释的变量进行赋值
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class MainActivity_MembersInjector implements MembersInjector {
private final MembersInjector supertypeInjector;
private final Provider personProvider;
public MainActivity_MembersInjector(MembersInjector supertypeInjector, Provider personProvider) {
assert supertypeInjector != null;
this.supertypeInjector = supertypeInjector;
assert personProvider != null;
this.personProvider = personProvider;
}
@Override
public void injectMembers(MainActivity instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference");
}
supertypeInjector.injectMembers(instance);
instance.person = personProvider.get(); //赋值给MainActivity.person
}
public static MembersInjector create(MembersInjector supertypeInjector, Provider personProvider) {
return new MainActivity_MembersInjector(supertypeInjector, personProvider);
}
}
多层依赖的情况
在多层依赖的情况下,最大的改变只是在MembersInjector的injectMembers中赋值部分添加了赋值的语句
@Override
public void injectMembers(MainActivity instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference");
}
supertypeInjector.injectMembers(instance);
//以下为多层依赖情况下的赋值
instance.person = personProvider.get();
instance.shoppingCart = shoppingCartProvider.get();
}
').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('
').text(i));
};
$numbering.fadeIn(1700);
});
});
以上就介绍了Dagger2生成代码解析,包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_521830.html