1

伙计们!

我的应用程序中有两个 Maven 模块 - 域和持久性。

域具有域对象、服务和到外部端点的“数据提供者”接口,例如持久性。域包含业务逻辑并且没有外部依赖——他对持久性一无所知。

持久性取决于域。它从域模块实现“数据提供者”接口。它可能是关系数据库实现、nosql 实现、文件实现等。

例如,我在域中有接口PersonRepository ,如下所示:

public interface PersonRepository {
    List<Person> findAll();
    List<Customer> findByLastName(String lastName);
}

我想用 Spring Data JPA 实现数据提供者接口。我需要写这样的东西:

public interface PersonRepository extends CrudRepository<Person, Long> {
    List<Person> findAll();
    List<Person> findByLastName(String lastName);
}

但我不想将 spring 依赖项注入“核心域”。我想保持我的领域非常轻量级和独立。

有没有办法在 Persistence 模块中使用 Spring Data 实现 PersonRepository?

4

2 回答 2

1

无需通过 Spring Data 扩展现成的接口,您只需将方法复制到您自己的接口中即可。通常,您只需在其@Repository上添加注释,Spring Data 就会完成它的工作。但这会重新引入依赖关系。

所以你可以做的是在你的 Spring 配置中调用JpaRepositoryFactory.getRepository你自己。像这样的东西应该工作:

@Bean
public PersonRepository(RepositoryFactorySupport factory) {
    return factory.getRepository(PersonRepository.class);
}

这将在您的持久性模块中或在执行所有模块的接线的第三个模块中,因此依赖关系不应该成为问题。

于 2017-12-01T08:59:37.557 回答
0

Spring Data JPA 接口可以扩展多个接口。像下面这样的东西应该可以工作。

在您的域模块中定义:

public interface PersonRepository {
    List<Person> findAll();
    List<Customer> findByLastName(String lastName);
}

在您的持久性模块中:

@Reposistory
public interface SpringDataJPAPersonRepository extends CrudRepository<Person, Long>, PersonRepository {
    // Any Spring Data JPA specific overrides e.g. @Query
}
于 2017-11-30T20:54:36.070 回答