gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:04:55 24 4
gpt4 key购买 nike

存在以下类

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/

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