Search code examples
javadependency-injectiondagger-2dagger

Dagger Dependency Injection Provider with Qualifier


I'd like to get a confirmation that: if two providers providing the same type of instance, one with qualifier and the other one without, would this work?

// Existing provider
@Singleton
@Provides
static MetricsCollectorFactory provideMetricsCollectorFactory(){}

// New one to be added
@Singleton
@Provides
@VersionBasedMetricsCollectorFactory
static MetricsCollectorFactory provideVersionBasedMetricsCollectorFactory(){}

For the following two cases, especially the TestClass1, will Dagger know which MetricsCollectorFactory to inject?

@Inject
TestClass1(MetricsCollectorFactory basicFactory)

@Inject
TestClass2(@VersionBasedMetricsCollectorFactory MetricsCollectorFactory basicFactory)

Solution

  • Yes, as on the Dagger dev guide, there are zero or one qualifier instances per key or binding, and absent is different than present.

    However, from a readability perspective, you might consider avoiding letting the two coexist—particularly if your team is unfamiliar with Dagger. Your @VersionBasedMetricsCollectorFactory MetricsCollectorFactory might wind up as a field metricsCollectorFactory, which might cause an unfamiliar developer to inject a bare MetricsCollectorFactory instead of a desired @VersionBasedMetricsCollectorFactory MetricsCollectorFactory. In contrast, introducing an alternative like @Default MetricsCollectorFactory might be helpful, or at least would provide a useful compilation error to encourage a more careful reading of the injection key.