java - 在Spring的Service层注入(inject)一个数据存储库

标签 java spring spring-boot spring-data

在我的网络应用程序中,我有两种不同的数据存储 - 数据库和文件。在 application.properties 中,我可以设置我想使用哪一个。我使用 Spring Data JPA 来从数据库访问对象,因此我的 DataBaseRepository 扩展了 CrudRepository。

我想在Service层注入(inject)Repository的一个接口(interface),并且 实现将取决于所选的配置文件(在 application.properties 中)。 问题是我的 FileRepository 没有实现 CrudRepository,所以我的存储库没有用于注入(inject)的通用接口(interface)。

方法 1:假设我的 FileRepository 扩展了 CrudRepository(并且我用 @NoRepositoryBean 标记 FileRepository)

问题:我的FileRepository实现必须实现许多我不需要的方法(我不知道这是否是正常方法并且有效)

方法2:不要使用CrudRepository接口(interface)

问题:编写许多样板代码

所以,请告诉我另一种方法,如果它们存在于这种情况下,或者说哪种方法更好。如有任何帮助,我们将不胜感激。

最佳答案

您可以创建一个扩展 CrudRepository 的 CustomCrudRepository 和一个 BaseRepository。BaseRepository 接口(interface)包含任何实现都必须支持的每个方法。最有可能从 CrudRepository 复制签名。比基于BaseRepository的注入(inject)。

很难解释,所以请看下面没有泛型的示例。您可以自行添加它们。

public interface BaseRepo {
    // common methods
    long count();

    ...
}

@NoRepositoryBean
interface CustomCrudRepository extends CrudRepository, BaseRepo {

}

interface EntityRepository extends CustomCrudRepository {

}

class FileRepository implements BaseRepo {

    @Override
    public long count() {
        return 0;
    }
}

@Service
class SomeService {

    @Autowired
    private BaseRepo repo;
}

关于java - 在Spring的Service层注入(inject)一个数据存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164299/

相关文章:

java - 使用 Spring Jdbc 模板面对嵌套 beans 查询

java - Spring后端测试

java - 在 Spring Boot 应用程序中启动 ApplicationContext 时出错

java - 为什么安装新的JDK时这4个文件会复制到Windows/System32文件夹中?

java - 如何用给定字符串中的 ""替换给定子字符串?

java - 面向对象的安全编程

java - 无法在 Spring MVC 中发送 POST 请求

java - 属性访问异常 : could not get a field value by reflection getter While using Hibernate

java - Spring Boot 在作为 Servlet 运行时可以连接到 Cassandra,但不能作为命令行运行

java - 将 Jparepository 的 FindAll 方法与 ModelAndView 结合使用