gpt4 book ai didi

java - spring 如何 Autowiring 通用转换器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:29 24 4
gpt4 key购买 nike

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

我已经实现了 spring Converter 接口(interface):

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

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

在 Controller 中我像这样 Autowiring 它

@Autowire
Converter<MyClass1, MyClass2> myConverter;

惊喜,但 spring 注入(inject)了适当的类。

根据我的信息,spring 在运行时 Autowiring bean。我也知道在运行时通用类型删除。

我试图理解 Spring,但对我来说很难。

你能解释一下spring是如何解决这种情况的吗?

最佳答案

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

对于这个类:

public class MyConverter implements Converter<MyClass1, MyClass2>

super 接口(interface)(Converter)的参数化类型被保留,因为 JVM 应该知道编译后的 MyConverter 实现了一个抽象方法,其签名实际上是 < em>包含这两种类型(MyClass1MyClass2)。

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

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

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

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

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

关于java - spring 如何 Autowiring 通用转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32008227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com