spring 如何自动装配通用转换器?

How does spring autowire generic converters?

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

我实现了springConverter接口:

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

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

在控制器中,我像这样自动装配它

@Autowire
Converter<MyClass1, MyClass2> myConverter;

惊讶,但 spring 正确注入 class。

根据我的信息spring 在运行时自动装配 bean。我也知道在运行时通用类型擦除。

我试着去理解Spring so but it hard for me.

您能解释一下 spring 如何解决这种情况吗?

这是因为他们在博文中描述的内容 here

报价,

Starting with Spring Framework 4.0, Spring will automatically consider generics as a form of @Qualifier. Behind the scenes, the new ResolvableType class provides the logic of actually working with generic types. You can use it yourself to easily navigate and resolve type information.

所以答案在this class and in this class (and in this class).

即使发生了类型擦除,部分 类型参数信息实际上并没有被擦除,而是在运行时的其他地方保留下来。

为此class:

public class MyConverter implements Converter<MyClass1, MyClass2>

保留了超级接口 (Converter) 的参数化类型,因为 JVM 应该知道编译后的 MyConverter 实现了一个带有实际上 签名的抽象方法包含这两种类型(MyClass1MyClass2)。

为了演示这一点,您可以在一个简单的 main 方法中尝试以下代码片段 - 此处,超级接口的参数化信息在运行时通过反射恢复:

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

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

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

这些与反射相关的 classes(TypeParameterizedType 等)实际上被 Spring 的 ResovableType class,它负责根据提供的类型信息 检测 最佳布线候选者。