如何在Spring中自动装配通用类型<T>的Bean?

我有一个Item<T>需要在@Configuration类中自动装配的bean 。

@Configuration

public class AppConfig {

@Bean

public Item<String> stringItem() {

return new StringItem();

}

@Bean

public Item<Integer> integerItem() {

return new IntegerItem();

}

}

但是当我尝试时@Autowire Item,出现以下异常。

"No qualifying bean of type [Item] is defined: expected single matching bean but found 2: stringItem, integerItem"

如何Item<T>在Spring中自动装配通用类型?

回答:

一个简单的解决方案是升级到Spring 4.0,因为它将自动将泛型视为的一种形式@Qualifier,如下所示:

@Autowired

private Item<String> strItem; // Injects the stringItem bean

@Autowired

private Item<Integer> intItem; // Injects the integerItem bean

实际上,你甚至可以在插入列表时自动嵌套嵌套的泛型,如下所示:

// Inject all Item beans as long as they have an <Integer> generic

// Item<String> beans will not appear in this list

@Autowired

private List<Item<Integer>> intItems;

如何运作?

新ResolvableType类提供了实际使用泛型类型的逻辑。你可以自己使用它来轻松浏览和解析类型信息。上的大多数方法ResolvableType本身都会返回ResolvableType,例如:

// Assuming 'field' refers to 'intItems' above

ResolvableType t1 = ResolvableType.forField(field); // List<Item<Integer>>

ResolvableType t2 = t1.getGeneric(); // Item<Integer>

ResolvableType t3 = t2.getGeneric(); // Integer

Class<?> c = t3.resolve(); // Integer.class

// or more succinctly

Class<?> c = ResolvableType.forField(field).resolveGeneric(0, 0);

以上是 如何在Spring中自动装配通用类型&lt;T&gt;的Bean? 的全部内容, 来源链接: utcz.com/qa/421575.html

回到顶部