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

Provide singleton dependency vs object initialization

我有两个关于 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 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 则不会。