首先,我为实体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;
}

09-13 11:03