如何将Repository和Repository实现拆分为不同的模块?

时间:2017-11-30 20:18:43

标签: java spring spring-data clean-architecture

人们!

我的应用程序中有两个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);
}

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

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您可以只在自己的界面中复制方法,而不是通过Spring Data扩展现成的界面。通常,您只需在其上添加@Repository注释,Spring Data就可以完成其工作。但这会重新引入依赖性。

所以你可以做的是在你的Spring Configuration中自己调用JpaRepositoryFactory.getRepository。这样的事情应该有效:

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

这将在您的持久性模块或第三个模块中进行所有模块的连接,因此依赖性应该不是问题。