调整repository定义

通常情况下,我们的repository接口会继承Repository,CrudRepository或PagingAndSortingRepository接口。但是,如果不想通过extend关键字继承Spring Data的接口,还可以采用在自定义的repository接口上加注解的方式,两种方式是等价的。例子如下:

  1. public interface UserDao extends Repository<AccountInfo, Long>{...}
  2. @RepositoryDefinition(domainClass = Person, idClass = Long.class)
  3. public interface PersonRepository {...}

此外,继承CrudRepository接口,会为操作域对象提供了一组可立即使用的方法。如果开发者不想暴露CrudRepository接口的全部方法,只需简单的将需要的方法复制到自己的repository接口中。

这让我们可以在Spring Datade Repository的基础上定义自己的抽象接口

Example 5.Selectively exposing CRUD methods(选择性暴露方法)

  1. @NoRepositoryBean
  2. interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
  3. T findOne(ID id);
  4. T save(T entity);
  5. }
  6. interface UserRepository extends MyBaseRepository<User, Long> {
  7. User findByEmailAddress(EmailAddress emailAddress);
  8. }

在上面的代码中,我们先定义了一个公共的基础接口MyBaseRepository,并提供findOne和save两个方法。接着声明一个UserRepository的接口并继承基础接口MyBaseRepository,所以UserRepository拥有保存User,根据id查找user和根据邮箱地址查找User三个方法。

注意,中间过渡的接口MyBaseRepository上加了NoRepositoryBean注解,这个注解是告诉Spring Data不要为这个接口创建repository代理实例。