使用泛型作为自动装配限定符

除了使用@Qualifier注解外,您还可以使用Java泛型类型作为一种隐式的限定形式。例如,假设您有以下配置:

  • Java

  • Kotlin

@Configuration
public class MyConfiguration {

	@Bean
	public StringStore stringStore() {
		return new StringStore();
	}

	@Bean
	public IntegerStore integerStore() {
		return new IntegerStore();
	}
}
@Configuration
class MyConfiguration {

	@Bean
	fun stringStore() = StringStore()

	@Bean
	fun integerStore() = IntegerStore()
}

假设前面的bean实现了一个泛型接口(即Store<String>Store<Integer>),您可以使用@Autowire注入Store接口,并且泛型被用作限定符,如下例所示:

  • Java

  • Kotlin

@Autowired
private Store<String> s1; // <String>限定符,注入stringStore bean

@Autowired
private Store<Integer> s2; // <Integer>限定符,注入integerStore bean
@Autowired
private lateinit var s1: Store<String> // <String>限定符,注入stringStore bean

@Autowired
private lateinit var s2: Store<Integer> // <Integer>限定符,注入integerStore bean

当自动装配列表、Map实例和数组时,泛型限定符也适用。以下示例自动装配一个泛型List

  • Java

  • Kotlin

// 只要具有<Integer>泛型,就注入所有Store bean
// Store<String> bean不会出现在此列表中
@Autowired
private List<Store<Integer>> s;
// 只要具有<Integer>泛型,就注入所有Store bean
// Store<String> bean不会出现在此列表中
@Autowired
private lateinit var s: List<Store<Integer>>