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

错误信息

clipboard.png

clipboard.png

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

阅读 605
评论 2019-03-09 提问
    2 个回答
    imango
    • 1.4k

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

    clipboard.png

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

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

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

    评论 赞赏 2019-03-11

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

      评论 赞赏 2019-03-09
        撰写回答

        登录后参与交流、获取后续更新提醒