簡體   English   中英

spring springowire通用轉換器如何?

[英]How does spring autowire generic converters?

偶爾我注意到有趣的事情:

我已經實現了spring Converter接口:

@Component
public class MyConverter implements Converter<MyClass1, MyClass2> {

    @Override
    public MyClass2 convert(MyClass1 source) {
       // doesn't matter
    }
}

在控制器中,我像這樣自動裝配它

@Autowire
Converter<MyClass1, MyClass2> myConverter;

驚喜,但春天注入適當的課程。

根據我的信息,spring在運行時自動裝配bean。 另外我知道在運行時泛型類型擦除。

我試圖了解春天的靈魂,但對我來說很難。

你能解釋一下春天如何解決這種情況嗎?

即使發生了類型擦除, 一些類型參數信息實際上並沒有被刪除,但它在運行時的其他地方相當保留。

對於這堂課:

public class MyConverter implements Converter<MyClass1, MyClass2>

保留了超級接口( Converter )的參數化類型,因為JVM應該知道編譯的MyConverter實現了一個帶有簽名的抽象方法,該簽名實際上包含這兩種類型( MyClass1MyClass2 )。

為了演示這一點,您可以在一個簡單的main方法中嘗試以下代碼段 - 這里,在運行時使用Reflection恢復超級接口的參數化信息:

Type[] interfaces = MyConverter.class.getGenericInterfaces();

ParameterizedType interfaceType = (ParameterizedType) interfaces[0];
Type[] types = interfaceType.getActualTypeArguments();

for (Type argument : types) {
    System.out.println(argument.getTypeName());
}

這些與Reflection相關的類( TypeParameterizedType等)是Spring的ResovableType類實際使用的類,它負責根據提供的類型信息檢測最佳的布線候選。

這是因為他們在自己的博文描述了這里

引用,

從Spring Framework 4.0開始,Spring會自動將泛型視為@Qualifier的一種形式。 在幕后,新的ResolvableType類提供了實際使用泛型類型的邏輯。 您可以自己使用它來輕松導航和解析類型信息。

所以答案是在這個類這個類中 (以及在這個類中 )。

暫無
暫無

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

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