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

发布于 2022-09-11 18:17:52 字数 1811 浏览 18 评论 0

问题描述

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方法;

错误信息

clipboard.png

clipboard.png

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无人问我粥可暖 2022-09-18 18:17:52

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

赴月观长安 2022-09-18 18:17:52

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

clipboard.png

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文