java - 使用泛型类型进行 Spring 依赖注入(inject)

标签 java spring generics

存在以下类

class Entity{
}

class Dto{
}

public abstract class BaseMapper<E extends Entity, D extends Dto>{

}

以及映射器的几个具体实现,例如:

FooMapper extends BaseMapper<Foo, FooDto>{

}

FeeMapper extends BaseMapper<Fee, FeeDto>{

}

不,我想集成一些“包装器”,它比正常的数据映射要多一些,因为我得到了一个新的概念/问题

@Component
public final class RevMapper<ENTITY extends Entity, DTO extends Dto> {

    private BaseMapper<ENTITY, DTO> baseMapper;

    @Autowired
    public <MAPPER extends BaseMapper<ENTITY, DTO>> RevMapper(MAPPER mapper) {
        this.baseMapper = mapper;
    }

    public List<RevDto<DTO>> toDto(final List<Rev<ENTITY>> revList) {
        for(Rev<ENTITY> rev: revList){
            ...
            baseMapper.toDto(rev.getEntity(), true);
        }
        ...
    }
}

并将其包含在我的服务中,例如:

@Autowired
private RevMapper<Foo, FooDto> fooRevMapper;

现在的问题是:

com.test.package.RevMapper 中构造函数的参数 0 需要单个 bean,但找到了 2 个: - FooMapper - 费用映射器

Spring 不知道该选择哪一个。是的,我所知道的是泛型中的类型删除。所以基本上在编译应用程序后就知道有一个

RevMapper<Entity,Dto>

但没有具体说明是哪种类型。我如何告诉 Spring 插入正确的组件,或者你将如何处理这个问题。我不想为每种类型的 Mapper 编写相同的代码行......

最佳答案

我能想到的解决方案并不比创建很多子类那么耗时。

首先使 RevMapper 不是 @Component,然后创建一个类,如下所示:

@Configuration
public final class Mappers{

    private final FooMapper fooMapper;
    private final FeeMapper feeMapper;

    @Autowired
    public Mappers(FooMapper fooMapper, FeeMapper feeMapper){
        this.fooMapper = fooMapper;
        this.feeMapper = feeMapper;
    }

    @Bean
    public RevMapper<Foo, FooDto> fooRevMapper(){
        return new RevMapper(fooMapper);
    }

    @Bean
    public RevMapper<Fee, FeeDto> feeRevMapper(){
        return new RevMapper(feeMapper);
    }
}

这只不过是为您想要提供的每个不同的 RevMapper 创建一个方法。

关于java - 使用泛型类型进行 Spring 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534253/

相关文章:

java - 如何在任意大小的窗口中跟踪最高值和最低值

java - Spring Cloud微服务服务器端口强制转换异常

java - MinHeap 提取/heapDown() 失败 : incorrect order of elements

java - java中的动态方法返回类型

c# - 在 C# 中返回 'this' 的数组

java - 如何使用 Maven 创建具有依赖项的可执行/可运行 JAR?

java - 如何停用 Spring Data 异常转换

spring - Spring 3.1 Junit测试中获取WebApplicationContext

java - hibernate一对多自动添加子对象异常

scala - 在 Scala 中,是否可以实例化泛型类型 T 的对象?