【问题标题】:How does spring autowire generic converters?弹簧自动装配通用转换器如何?
【发布时间】:2015-08-14 10:45:51
【问题描述】:

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

我已经实现了springConverter接口:

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

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

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

@Autowire
Converter<MyClass1, MyClass2> myConverter;

惊喜,但弹簧注入适当的类。

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

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

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

【问题讨论】:

    标签: java spring spring-mvc generics autowired


    【解决方案1】:

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

    对于这个类:

    public class MyConverter implements Converter<MyClass1, MyClass2>
    

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

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

    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 类实际使用的类,它负责检测最好的根据提供的类型信息进行布线的候选者。

    【讨论】:

    • 我想补充一点,关于类型参数的信息也可以从myConverter 字段访问(尽管不能从该字段的 value 访问)。该信息可以与MyConverter 类中的信息相匹配。
    【解决方案2】:

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

    引用,

    从 Spring Framework 4.0 开始,Spring 会自动将泛型视为@Qualifier 的一种形式。在幕后,新的ResolvableType 类提供了实际使用泛型类型的逻辑。您可以自己使用它来轻松导航和解析类型信息。

    所以答案在this classthis class(以及this class)中。

    【讨论】:

    • 这应该是评论而不是答案。
    • 正如您在how to answer 中看到的那样:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户知道它是什么以及为什么它在那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    • Spring Framework Core 实际上是一个非常吸引人的地方。我应该经常阅读它。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2014-07-08
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多