【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> {
@AutowiredBaseMapper<R> baseMapper;
@Override
public void update(R r){
baseMapper.updateById(r);
}
}
@Service
public class BrandServiceImpl implements BrandService {
@Autowiredprivate BrandRepository brandRepository;
@Override
public void updateBrandByCode(Brand brand) {
brandRepository.update(brand);
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
我期待的结果是 brandRepository调用 update 的时候,能根据传进去的R实体,调用对应的BaseMapper<R> 的updateById方法;
错误信息
看这错误是Spring不知道MybatisCustomizedRepositoryImpl到底要依赖哪个Mapper,所以我想到底有没有好的方法可以满足Spring 再调用时可以根据MybatisCustomizedRepository<Brand>指定的泛型找到对应的接口实现类。
回答
题主,你好,根据你提的问题,我个人觉得,无法避免的是需要动态查找当前所用的Mapper
了,因为这是解决你这个问题必须克服的问题,然后看你的描述,感觉你也抓住了这个点,提到这句
只是不够优雅,而再优雅的方式其实我觉得也绕不开这个问题:
即调用时如何指明当前到底用了什么Mapper
所以传参的方式不优雅,干脆用约定大于配置的原则,约定取名规则后,用类的Class
名字切割出Mapper
的bean
名字,再通过bean
找到对应的Mapper
不知道这么行不。。 ( •́ .̫ •̀ )
感觉这个用自动绑定不好做。
以上是 【Java】Spring 关于如何动态处理泛型装配的问题。 的全部内容, 来源链接: utcz.com/a/87431.html