Qualifier
You can use the @Qualifier
annotation to distinguish between different instances of the same type.
First, define the qualifier annotations with @Qualifier
.
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ID1
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ID2
Then, use the annotations to specify the qualifier when providing the instances.
@ID1
@Provide
fun provideDB1(): DB {
DB.create("id1")
}
@ID1
@Provide
fun provideDB2(): DB {
DB.create("id2")
}
Finally, use the qualifiers to inject the instances you need.
class Repository(
@ID1
val db1: DB,
@ID2
val db2: DB
)
You can also use qualifier annotations when calling the inject()
function.
val db1 = inject<DB>(ID1())
val db2 = inject<DB>(ID2())
This allows you to provide and inject multiple instances of the same type without ambiguity.
Distinguishing with Qualifier members
Qualifier annotations can also have members to further distinguish between instances.
For example, you can use the enum class like this:
enum class QualifierType {
ID1,
ID2
}
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class EnumQualifier(val type: QualifierType)
@EnumQualifier(QualifierType.ID1)
@Provide
fun provideDB1(): DB {
DB.create("id1")
}
@EnumQualifier(QualifierType.ID2)
@Provide
fun provideDB2(): DB {
DB.create("id2")
}
val db1 = inject<DB>(EnumQualifier(QualifierType.ID1))
val db2 = inject<DB>(EnumQualifier(QualifierType.ID2))
The following types can be used as qualifier members:
- Number
- Boolean
- Char
- String
- KClass
- Enums
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class IntQualifier(val value: Int)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class FloatQualifier(val value: Float)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class BooleanQualifier(val value: Boolean)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class CharQualifier(val value: Char)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class StringQualifier(val value: String)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ClassQualifier(val value: KClass<*>)
enum class QualifierType {
ID1,
ID2
}
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class EnumQualifier(val type: QualifierType)
The following types are currently not supported:
- Other annotations
- Array (including varargs)
annotation class OtherAnnotation(val value: String)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AnnotationQualifier(
val value: OtherAnnotation // Not supported!
)
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class StringArrayQualifier(val value: Array<String>) // Not supported!
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class IntArrayQualifier(val value: IntArray) // Not supported!
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class VarargArrayQualifier(vararg val value: Int) // Not supported!
Qualifier members can have multiple values and can have default values:
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class CustomQualifier(
val int: Int,
val string: String = "default",
)
Named annotation
You can also use the @Named
qualifier to distinguish between different instances of the same type based on a string value.
@Named("db1")
@Provide
fun provideDB1(): DB {
DB.create("id1")
}
@Named("db2")
@Provide
fun provideDB2(): DB {
DB.create("id2")
}
class Repository(
@Named("db1")
val db1: DB,
@Named("db2")
val db2: DB
)
val db1 = inject<DB>(Named("db1"))
val db2 = inject<DB>(Named("db2"))
The inject()
API for Named
has changed since v1.2.0.
// Until v1.1.0
val db1 = inject<DB>("db1")
val db2 = inject<DB>("db2")
// Since v1.2.0
val db1 = inject<DB>(Named("db1"))
val db2 = inject<DB>(Named("db2"))