【Java】Spring 关于如何动态处理泛型装配的问题。

问题描述

Spring 如何动态处理泛型装配。

问题出现的环境背景及自己尝试过哪些方法

由于在项目中集成了Spring-data-jpa和 mybatis,但还是统一一个repository层,xxxRepository接口继承MybatisRepository接口和JpaRepository,然后接口方法由各自的框架去实现,只需要调用xxxRepository即可。无需关心底层是Jpa还是Mybatis实现。
现在的问题点,由于需要在MybatisRepository统一封装一些通用接口,类似JPA那样。但实际上MybatisRepository里面引用了一个Mapper接口,需要泛型去支持不同的Mapper,所以就会导致一个MybatisRepository有多个Mapper实现。导致项目在启动的时候,Spring不知道注入哪个Mapper。

尝试:我想着在业务层传入参数,然后MybatisRepository的实现类做处理(根据参数ApplicationContext动态获取Bean),但是觉得不够优雅。想请教有什么好方法。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
@Repository
public interface BrandRepository extends JpaRepository<BrandE, Long>, MybatisCustomizedRepository<Brand> {

}

public interface MybatisCustomizedRepository<R> {

void update(R r);

}

public class MybatisCustomizedRepositoryImpl<R> implements MybatisCustomizedRepository<R> {

@Autowired

BaseMapper<R> baseMapper;

@Override

public void update(R r){

baseMapper.updateById(r);

}

}

@Service
public class BrandServiceImpl implements BrandService {

@Autowired

private BrandRepository brandRepository;

@Override

public void updateBrandByCode(Brand brand) {

brandRepository.update(brand);

}

}

你期待的结果是什么?实际看到的错误信息又是什么?

我期待的结果是 brandRepository调用 update 的时候,能根据传进去的R实体,调用对应的BaseMapper<R> 的updateById方法;

错误信息

【Java】Spring 关于如何动态处理泛型装配的问题。

【Java】Spring 关于如何动态处理泛型装配的问题。

看这错误是Spring不知道MybatisCustomizedRepositoryImpl到底要依赖哪个Mapper,所以我想到底有没有好的方法可以满足Spring 再调用时可以根据MybatisCustomizedRepository<Brand>指定的泛型找到对应的接口实现类。

回答

题主,你好,根据你提的问题,我个人觉得,无法避免的是需要动态查找当前所用的Mapper了,因为这是解决你这个问题必须克服的问题,然后看你的描述,感觉你也抓住了这个点,提到这句

【Java】Spring 关于如何动态处理泛型装配的问题。

只是不够优雅,而再优雅的方式其实我觉得也绕不开这个问题:
即调用时如何指明当前到底用了什么Mapper

所以传参的方式不优雅,干脆用约定大于配置的原则,约定取名规则后,用类的Class名字切割出Mapperbean名字,再通过bean找到对应的Mapper

不知道这么行不。。 ( •́ .̫ •̀ )

感觉这个用自动绑定不好做。

以上是 【Java】Spring 关于如何动态处理泛型装配的问题。 的全部内容, 来源链接: utcz.com/a/87431.html

回到顶部