[英]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
實現了一個帶有簽名的抽象方法,該簽名實際上包含這兩種類型( MyClass1
和MyClass2
)。
為了演示這一點,您可以在一個簡單的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相關的類( Type
, ParameterizedType
等)是Spring的ResovableType
類實際使用的類,它負責根據提供的類型信息檢測最佳的布線候選。
這是因為他們在自己的博文描述了這里 。
引用,
從Spring Framework 4.0開始,Spring會自動將泛型視為@Qualifier的一種形式。 在幕后,新的ResolvableType類提供了實際使用泛型類型的邏輯。 您可以自己使用它來輕松導航和解析類型信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.