我对DDD存储库模式了解不多,但Spring中的实现让我很困惑.
public interface PersonRepository extends JpaRepository{ … }
当接口扩展JpaRepository(或MongoDBRepository ...)时,如果从一个db更改为另一个db,则还必须更改接口.
对我来说,接口是为了提供一些抽象,但在这里并不是那么抽象......
你知道为什么Spring-Data会这样吗?
你是对的,从外部的角度来看,接口是关于所有实现类的工作的抽象.
这就是这里发生的事情:
JpaRepository是所有JPA存储库的通用视图(适用于所有不同的实体),而MongoDBRepository对于所有MongoDB实体都是相同的.
但JpaRepository和MongoDBRepository没有任何共同之处,除了常见的超级接口中定义的内容:
org.springframework.data.repository.PagingAndSortingRepository
org.springframework.data.repository.Repository
所以对我来说这看起来很正常.
如果您使用实现存储库的类,那么如果您希望能够从JPA实现切换到基于文档的实现,请使用PagingAndSortingRepository或Repository(抱歉,但无论如何我无法想象这样的用例).当然,您的Repository实现应该实现正确的接口(JpaRepository,MongoDBRepository),具体取决于它是什么.
在这篇博客文章http://blog.springsource.com/2011/02/10/getting-started-with-spring-data-jpa/中可以清楚地说明这背后的原因.
定义此接口有两个目的:首先,通过扩展JpaRepository,我们在我们的类型中获得了一堆通用的CRUD方法,允许保存帐户,删除它们等等.其次,这将允许Spring Data JPA存储库基础结构扫描此接口的类路径并为其创建Spring bean.
如果你不信任来源如此接近来源(双关语),那么阅读这篇文章可能是个好主意http://www.brucephillips.name/blog/index.cfm/2011/3/25/Using -Spring-Data-JPA-To-Reduced-Data-Access-Coding.
我不需要编码的是PersonRepository接口的实现.Spring将创建此接口的实现,并使PersonRepository bean可以自动连接到我的Service类中.PersonRepository bean将具有所有标准CRUD方法(将是事务性的)并返回Person对象或Person对象的集合.因此,通过使用Spring Data JPA,我节省了编写自己的实现类.