首先,我为实体JpaRepository
类使用Foo
创建了标准存储库,以将其存储在数据库中。
public interface FooRepository extends JpaRepository<Foo, Long> {
}
此外,作为我的第二个数据访问对象,我想使用我自己的简单CRUD操作接口实现,该接口将数据存储在文件中。
public interface FooDao {
Collection<Foo> getAll();
Foo getById(Long id);
void removeById(Long id);
void update(Foo foo);
void insert(Foo foo);
}
并且当我手动将两个变量都这样声明时,它可以正常工作
@Autowired
private FooRepository fooRepository;
@Autowired
private FooDao fooDao;
在服务中,我使用某种
switch
语句,通过helper变量来标识当前用户选择的数据源:private String datasource = "db"; // or "file"
但是此解决方案需要使用
if
语句来确定我需要使用哪个数据访问对象,哪些重复代码,当然也不是很优雅。public Foo getOne(Long id){
Foo result = null;
if(datasource.equals("db"))
result = fooRepository.findOne(id);
else if(datasource().equals("file"))
result = fooDao.getById(id);
return result;
}
如何在运行时在那些不同且不兼容的接口之间动态更改?如何使它们兼容,以使其互换使用,如何正确编写某种包装器?
最佳答案
您可以使您的FooDao
实现实现FooRepository
接口,而不是您自己的接口。这样,您只需为接口提供2种不同的实现,并可以在服务中以相同的方式处理它们。它们将是两种不同的Spring bean:
@Autowired
私有FooRepository fooRepository;
@Autowired
私有FooRepository fooDao;
您的实现将如下所示:
@零件
公共类FooDaoImpl实现FooRepository {
//您自己的由FooRepository声明的方法的实现
}
在您的using类中,您可以仅使用一种访问方法来获得以下接口之一:
私人FooRepository getFooDataAccess(){
返回“ db” .equals(数据源)? fooRepository:fooDao;
}