簡體   English   中英

Spring Autowired,將通用字段注入到通用類NoUniqueBeanDefinitionException中

[英]Spring Autowired, injecting generic fields in to generic classes, NoUniqueBeanDefinitionException

如果在類型信息上有兩個實例不同,則鍵入將通用接口的類型化的組件注入到通用類中的操作將失敗。

@Autowired
BetterObjectPrinter<Integer> integerBetterObjectPrinter;

@Autowired
BetterObjectPrinter<String> stringBetterObjectPrinter;


public interface ObjectPrinter<T> {

    public String print(T obj);
}

@Component
public class IntegerPrinter implements ObjectPrinter<Integer> {

    public String print(Integer obj) {
        return obj.toString();
    }
}

@Component
public class StringPrinter implements ObjectPrinter<String> {

    public String print(String obj) {
        return obj.toString();
    }
}


@Component
public class BetterObjectPrinter<T> {

    @Autowired
    ObjectPrinter<T> objectPrinter;

    public String print(T obj) {
        return objectPrinter.print(obj);
    }
}

我想知道這是否是預期的結果,是否有足夠的類型信息可用?

我得到的結果是

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.ObjectPrinter<?>' available: expected single matching bean but found 2: integerPrinter,stringPrinter

但是,如果ObjectPrinter是通用類,它確實可以工作,因此類型信息必須仍然可用

@Component
public class ObjectPrinter<T> {

    public String print(T obj) {
        return obj.toString();
    }
}

如果使用@Configuration@Bean批注創建2個bean來創建@Bean的2個實例, BetterObjectPrinter

以上內容是使用Spring 4.3.13測試的。

是的,可以預料的是,spring不知道要自動連線到objectPrinter字段中的哪兩個。 您可以使用@Qualifier批注解決沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM