提供单例依赖与对象初始化
Provide singleton dependency vs object initialization
我有两个关于 Dagger2
的问题,它是 Singleton
范围,
我使用了 Retrofit
和 GSON
但这只是为了举例,我想确保我正确理解 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);
}
- 我是否也应该将
OkHttpClient
提供者注释为单例? (我需要 Retrofit
个实例在应用程序范围内是单例的)。
provide GsonConverterFactory
VS create GsonConverterFactory
in retrofit provider like:
有什么区别
@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 绑定标记为单例将确保系统中需要 okhttpclient 绑定的任何绑定都将接收相同的绑定实例。如果您不将其标记为单例,那么每个依赖于 okhttpclient 的绑定都将获得一个单独的 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 绑定中删除 @Singleton
注释,那么 restclient 和 retrofit 将收到不同的 okhttpclient 绑定实例。
2。 provide GsonConverterFactory VS create GsonConverterFactory in retrofit provider like
有什么区别
同样,在您想要在图表中绑定的范围方面,差异是显而易见的。 provide GsonConverterFactory 将显示为图表中每个人的绑定,而 reate GsonConverterFactory 则不会。
我有两个关于 Dagger2
的问题,它是 Singleton
范围,
我使用了 Retrofit
和 GSON
但这只是为了举例,我想确保我正确理解 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);
}
- 我是否也应该将
OkHttpClient
提供者注释为单例? (我需要Retrofit
个实例在应用程序范围内是单例的)。 provide
有什么区别GsonConverterFactory
VS createGsonConverterFactory
in retrofit provider like:@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 绑定标记为单例将确保系统中需要 okhttpclient 绑定的任何绑定都将接收相同的绑定实例。如果您不将其标记为单例,那么每个依赖于 okhttpclient 的绑定都将获得一个单独的 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 绑定中删除 @Singleton
注释,那么 restclient 和 retrofit 将收到不同的 okhttpclient 绑定实例。
2。 provide GsonConverterFactory VS create GsonConverterFactory in retrofit provider like
有什么区别同样,在您想要在图表中绑定的范围方面,差异是显而易见的。 provide GsonConverterFactory 将显示为图表中每个人的绑定,而 reate GsonConverterFactory 则不会。