Dagger2 彻底了解如何构建依赖关系
Dagger2 彻底了解如何构建依赖关系上两篇文章分别介绍了
这两篇文章知识讲解了如何使用 本篇内容包括:
回顾代码:我们为了定义一个提供全局单例的对象而创建的 //module code
@Module
public class ApiModule {
public static final String END_POINT = "http://www.baidu.com";
@Provides
@Singleton
OkHttpClient provideOkHttpClient() {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60 * 1000,TimeUnit.MILLISECONDS)
.readTimeout(60 * 1000,TimeUnit.MILLISECONDS)
.build();
return client;
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(END_POINT)
.build();
return retrofit;
}
@Provides
@Singleton
User provideUser(){
return new User("name form ApiProvide");
}
}
----------------------------------分割线-----------------------------------------------
//Component code
@Singleton
@Component(modules = {ApiModule.class})
public interface AppComponent {
OkHttpClient getClient();
Retrofit getRetrofit();
User getUser();
}
这里是一个
AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.apiModule(new ApiModule())
.build();
}
public AppComponent getAppComponent() {
return appComponent;
}
现在我们打开 public final class DaggerAppComponent implements AppComponent {
private Provider<OkHttpClient> provideOkHttpClientProvider;
private Provider<Retrofit> provideRetrofitProvider;
private Provider<User> provideUserProvider;
private DaggerAppComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static AppComponent create() {
return builder().build();
}
@SuppressWarnings("unchecked")
private void initialize(final Builder builder) {
this.provideOkHttpClientProvider =
DoubleCheck.provider(ApiModule_ProvideOkHttpClientFactory.create(builder.apiModule));
this.provideRetrofitProvider =
DoubleCheck.provider(
ApiModule_ProvideRetrofitFactory.create(
builder.apiModule,provideOkHttpClientProvider));
this.provideUserProvider =
DoubleCheck.provider(ApiModule_ProvideUserFactory.create(builder.apiModule));
}
@Override
public OkHttpClient getClient() {
return provideOkHttpClientProvider.get();
}
@Override
public Retrofit getRetrofit() {
return provideRetrofitProvider.get();
}
@Override
public User getUser() {
return provideUserProvider.get();
}
public static final class Builder {
private ApiModule apiModule;
private Builder() {}
public AppComponent build() {
if (apiModule == null) {
this.apiModule = new ApiModule();
}
return new DaggerAppComponent(this);
}
public Builder apiModule(ApiModule apiModule) {
this.apiModule = Preconditions.checkNotNull(apiModule);
return this;
}
}
}
可以看到这个 appComponent = DaggerAppComponent.builder()
.apiModule(new ApiModule())
.build();
可以看到,通过 @SuppressWarnings("unchecked")
private void initialize(final Builder builder) {
this.provideOkHttpClientProvider =
DoubleCheck.provider(ApiModule_ProvideOkHttpClientFactory.create(builder.apiModule));
this.provideRetrofitProvider =
DoubleCheck.provider(
ApiModule_ProvideRetrofitFactory.create(
builder.apiModule,provideOkHttpClientProvider));
this.provideUserProvider =
DoubleCheck.provider(ApiModule_ProvideUserFactory.create(builder.apiModule));
}
可以明显看到,这个 然后我们会发现这3个成员变量需要使用 public final class ApiModule_ProvideOkHttpClientFactory implements Factory<OkHttpClient> {
private final ApiModule module;
public ApiModule_ProvideOkHttpClientFactory(ApiModule module) {
assert module != null;
this.module = module;
}
@Override
public OkHttpClient get() {
return Preconditions.checkNotNull(
module.provideOkHttpClient(),"Cannot return null from a non-@Nullable @Provides method");
}
public static Factory<OkHttpClient> create(ApiModule module) {
return new ApiModule_ProvideOkHttpClientFactory(module);
}
}
可以看到,这个类是实现了一个 我们看看他的 我们看了一个 分析到这里我们总体上可以得出一个大致的架子: @Override
public OkHttpClient getClient() {
return provideOkHttpClientProvider.get();
}
@Override
public Retrofit getRetrofit() {
return provideRetrofitProvider.get();
}
@Override
public User getUser() {
return provideUserProvider.get();
}
这写的几个方法都是属于暴露出去的,用来让依赖它的 分析完 //Component code
@ActivityScope
@Component(modules = ActivityModule.class,dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(DaggerActivity daggerActivity);
}
----------------------------------分割线-----------------------------------------------
//module code
@Module
public class ActivityModule {
private DaggerActivity activity;
public ActivityModule(DaggerActivity activity) {
this.activity = activity;
}
@Provides
public DaggerActivity provideActivity() {
return activity;
}
@Provides
public DaggerPresenter provideDaggerPresenter(DaggerActivity activity,User user) {
return new DaggerPresenter(activity,user);
}
}
我们看看在 @Inject
DaggerPresenter presenter;
@Inject
OkHttpClient client;
@Inject
Retrofit retrofit;
private void inject() {
AppComponent appComponent = ((MyApplication) getApplication()).getAppComponent();
DaggerActivityComponent.builder()
.appComponent(appComponent)
.activityModule(new ActivityModule(this))
.build().inject(this);
}
我们先从 public final class DaggerActivityComponent implements ActivityComponent {
private Provider<DaggerActivity> provideActivityProvider;
private Provider<User> getUserProvider;
private Provider<DaggerPresenter> provideDaggerPresenterProvider;
private Provider<OkHttpClient> getClientProvider;
private Provider<Retrofit> getRetrofitProvider;
private MembersInjector<DaggerActivity> daggerActivityMembersInjector;
private DaggerActivityComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
@SuppressWarnings("unchecked")
private void initialize(final Builder builder) {
this.provideActivityProvider =
ActivityModule_ProvideActivityFactory.create(builder.activityModule);
this.getUserProvider =
new Factory<User>() {
private final AppComponent appComponent = builder.appComponent;
@Override
public User get() {
return Preconditions.checkNotNull(
appComponent.getUser(),"Cannot return null from a non-@Nullable component method");
}
};
this.provideDaggerPresenterProvider =
ActivityModule_ProvideDaggerPresenterFactory.create(
builder.activityModule,provideActivityProvider,getUserProvider);
this.getClientProvider =
new Factory<OkHttpClient>() {
private final AppComponent appComponent = builder.appComponent;
@Override
public OkHttpClient get() {
return Preconditions.checkNotNull(
appComponent.getClient(),"Cannot return null from a non-@Nullable component method");
}
};
this.getRetrofitProvider =
new Factory<Retrofit>() {
private final AppComponent appComponent = builder.appComponent;
@Override
public Retrofit get() {
return Preconditions.checkNotNull(
appComponent.getRetrofit(),"Cannot return null from a non-@Nullable component method");
}
};
this.daggerActivityMembersInjector =
DaggerActivity_MembersInjector.create(
provideDaggerPresenterProvider,getClientProvider,getRetrofitProvider);
}
@Override
public void inject(DaggerActivity daggerActivity) {
daggerActivityMembersInjector.injectMembers(daggerActivity);
}
public static final class Builder {
private ActivityModule activityModule;
private AppComponent appComponent;
private Builder() {}
public ActivityComponent build() {
if (activityModule == null) {
throw new IllegalStateException(ActivityModule.class.getCanonicalName() + " must be set");
}
if (appComponent == null) {
throw new IllegalStateException(AppComponent.class.getCanonicalName() + " must be set");
}
return new DaggerActivityComponent(this);
}
public Builder activityModule(ActivityModule activityModule) {
this.activityModule = Preconditions.checkNotNull(activityModule);
return this;
}
public Builder appComponent(AppComponent appComponent) {
this.appComponent = Preconditions.checkNotNull(appComponent);
return this;
}
}
}
我们调用了以下代码: DaggerActivityComponent.builder()
.appComponent(appComponent)
.activityModule(new ActivityModule(this))
.build().inject(this);
看看我们到底做了什么操作,首先调用 @SuppressWarnings("unchecked")
private void initialize(final Builder builder) {
this.provideActivityProvider =
ActivityModule_ProvideActivityFactory.create(builder.activityModule);
this.getUserProvider =
new Factory<User>() {
private final AppComponent appComponent = builder.appComponent;
@Override
public User get() {
return Preconditions.checkNotNull(
appComponent.getUser(),getRetrofitProvider);
}
这里就比较多代码了,其实总的来说是为几个 值得注意的是,我们 this.getRetrofitProvider =
new Factory<Retrofit>() {
private final AppComponent appComponent = builder.appComponent;
@Override
public Retrofit get() {
return Preconditions.checkNotNull(
appComponent.getRetrofit(),"Cannot return null from a non-@Nullable component method");
}
};
可以看到,这个 最后我还有一个没有说,就是 MembersInjector<DaggerActivity> daggerActivityMembersInjector; 我们来看这个东西的实例化方式: public final class DaggerActivity_MembersInjector implements MembersInjector<DaggerActivity> {
private final Provider<DaggerPresenter> presenterProvider;
private final Provider<OkHttpClient> clientProvider;
private final Provider<Retrofit> retrofitProvider;
public DaggerActivity_MembersInjector(
Provider<DaggerPresenter> presenterProvider,Provider<OkHttpClient> clientProvider,Provider<Retrofit> retrofitProvider) {
assert presenterProvider != null;
this.presenterProvider = presenterProvider;
assert clientProvider != null;
this.clientProvider = clientProvider;
assert retrofitProvider != null;
this.retrofitProvider = retrofitProvider;
}
public static MembersInjector<DaggerActivity> create(
Provider<DaggerPresenter> presenterProvider,Provider<Retrofit> retrofitProvider) {
return new DaggerActivity_MembersInjector(presenterProvider,clientProvider,retrofitProvider);
}
@Override
public void injectMembers(DaggerActivity instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference");
}
instance.presenter = presenterProvider.get();
instance.client = clientProvider.get();
instance.retrofit = retrofitProvider.get();
}
public static void injectPresenter(
DaggerActivity instance,Provider<DaggerPresenter> presenterProvider) {
instance.presenter = presenterProvider.get();
}
public static void injectClient(DaggerActivity instance,Provider<OkHttpClient> clientProvider) {
instance.client = clientProvider.get();
}
public static void injectRetrofit(DaggerActivity instance,Provider<Retrofit> retrofitProvider) {
instance.retrofit = retrofitProvider.get();
}
}
可以看到,它持有3个 好了源码分析的差不多了,我们来看看最后一步。之前也提过疑问,我们为什么要在 我们来看看生成的 @Override
public void inject(DaggerActivity daggerActivity) {
daggerActivityMembersInjector.injectMembers(daggerActivity);
}
这个是调用了 @Override
public void injectMembers(DaggerActivity instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference");
}
instance.presenter = presenterProvider.get();
instance.client = clientProvider.get();
instance.retrofit = retrofitProvider.get();
}
看到了吗,我们传进来的 总结对于Dagger2的依赖原理分析了一边,如果看的过程中有些疑问的话,请仔细看代码,其实思路还是很清晰的,肯花点事件就可以了。大家可以通过以下链接获取源码来更深入的了解。 源码地址:https://github.com/Jamlh/Sample/tree/master/app/src/main/java/com/sample/dagger (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |