在spring组件构造函数中注入Class类型

问题描述 投票:0回答:1

出于通用性原因,我有一些具有以下主体的组件:

@Component
public class MyClass<C> extends SomeAbstractClass<A, C> {

    public MyClass(SomeClass1 someClass1, SomeClass2 someClass2) {
        super(superMethod(A.class, C.class));
    }
}

MyClass
只是我的类的通用骨架,它们在构造函数中可能有也可能没有某些对象(由
SomeClass1
SomeClass2
表示)。抽象超类有两个类,这里
A
是显式的,它不是泛型,因此
A.class
是有效的。但
C.class
无效,因为它是一个泛型类。

所以我尝试了这个:

@Component
public class MyClass<C> extends SomeAbstractClass<A, C> {

    public MyClass(SomeClass1 someClass1, SomeClass2 someClass2, Class<C> clazz) {
        super(superMethod(A.class, clazz));
    }
}

这段代码可以编译,但是Spring无法注入

Class<C> clazz
,我该怎么办?

编辑: 我也尝试过一些确实有效的方法,但我不太喜欢它。我为每个泛型类型创建一个类,如下所示:

@Component
public class MyClassWithoutGeneric extends SomeAbstractClass<A, B> {

    public MyClassWithoutGeneric(SomeClass1 someClass1, SomeClass2 someClass2) {
        super(superMethod(A.class, B.class));
    }
}

我不喜欢这个解决方案的是它不是很通用,也不太可维护

谢谢

java spring generics reflection
1个回答
0
投票

我找到了一个我更喜欢的解决方案:

我现在有一个包装类

MyClassFactory
,它具有所需的依赖项,如下所示:


@Component
public class MyClassFactory {

    private final SomeClass1 someClass1;
    private final SomeClass2 someClass2;

    public MyClassFactory(SomeClass1 someClass1, SomeClass2 someClass2) {
        this.someClass1 = someClass1;
        this.someClass2 = someClass2;
    }

    public <C> MyClass<C> create(Class<C> clazz) {
        return new MyClass<>(someClass1, someClass2, clazz);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.