gpt4 book ai didi

java - 提供单例依赖与对象初始化

转载 作者:行者123 更新时间:2023-11-29 22:40:29 24 4
gpt4 key购买 nike

我有两个关于 Dagger2 的问题,它是 Singleton 范围,

我使用了 RetrofitGSON 但这只是为了示例,我想确保我正确理解了 Dagger2

我有 NetowrkModule 像:

@Module
public class NetworkModule {

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
return new Retrofit.Builder()
.addConverterFactory(gsonConverterFactory)
.baseUrl("https://example.com")
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}

@Singleton
@Provides
OkHttpClient provideOkHttpClient() {
return new OkHttpClient.Builder().build();
}

@Singleton
@Provides
GsonConverterFactory provideGson() {
return GsonConverterFactory.create();
}
}

ApplicationComponent:

@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
ApplicationModule.class,
ViewBuildersModule.class,
AuthServiceModule.class
})

public interface ApplicationComponent {

@Component.Builder
interface Builder {
@BindsInstance
Builder application(MyApplication application);
ApplicationComponent build();
}
void inject(MyApplication app);
}
  1. 我是否也应该将 OkHttpClient 提供程序注释为单例? (我需要 Retrofit 实例在应用程序范围内是单例的)。
  2. provide GsonConverterFactory VS create GsonConverterFactory in retrofit provider 有什么区别,例如:

    @Module
    public class NetworkModule {

    @Provides
    @Singleton
    Retrofit provideRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
    return new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl("https://example.com")
    .client(okHttpClient)
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build();
    }

    @Singleton
    @Provides
    OkHttpClient provideOkHttpClient() {
    return new OkHttpClient.Builder().build();
    }
    }

最佳答案

<强>1。我是否也应该将 OkHttpClient 提供程序注释为单例? (我需要 Retrofit 实例在应用范围内是单例的)。

将 okhttpclient 绑定(bind)标记为单例将确保系统中任何需要 okhttpclient 绑定(bind)的绑定(bind)都将接收相同的绑定(bind)实例。如果您不将其标记为单例,那么每个依赖于 okhttpclient 的绑定(bind)都将获得一个单独的 okhttpclient 实例。例如,假设您创建了一个还需要 okhttpclient 的 RestClient。

@Singleton
@Provides
RestClient provideRestClient(OkHttpClient okhttpclient) {
return RestClient(okhttpClient);
}

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://example.com")
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}

@Singleton // marked as singleton
@Provides
OkHttpClient provideOkHttpClient() {
return new OkHttpClient.Builder().build();
}

在上面的例子中,retrofit 和 restclient 都会收到相同的 Okhttpclient 实例。

但是,如果您从 okhttpclient 绑定(bind)中删除 @Singleton 注释,那么 restclient 和 retrofit 将收到不同的 okhttpclient 绑定(bind)实例。

<强>2。 provide GsonConverterFactory VS create GsonConverterFactory in retrofit provider like 之间有什么区别

同样,在您想要在图表中绑定(bind)的范围方面,差异是显而易见的。 provide GsonConverterFactory 将显示为图表中每个人的绑定(bind),而 reate GsonConverterFactory 则不会。

关于java - 提供单例依赖与对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59050813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com