Skip to content

Repository接口实现 ​

深入理解Repository接口的实现机制,掌握Repository的创建和代理生成过程,理解方法解析、查询执行等核心流程。

📋 Repository概览 ​

Repository是Spring Data的核心抽象,提供了数据访问的统一接口。

🎯 一、Repository接口体系 ​

1.1 Repository接口 ​

Repository接口:

java
@Indexed
public interface Repository<T, ID> {
}

1.2 CrudRepository ​

CrudRepository接口:

java
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S entity);
    Optional<T> findById(ID id);
    boolean existsById(ID id);
    long count();
    void deleteById(ID id);
    void delete(T entity);
    void deleteAll();
}

1.3 PagingAndSortingRepository ​

PagingAndSortingRepository接口:

java
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort sort);
    Page<T> findAll(Pageable pageable);
}

🎯 二、Repository代理生成 ​

2.1 RepositoryFactory ​

RepositoryFactory:

java
public interface RepositoryFactory {
    <T, ID> RepositoryMetadata getRepositoryMetadata(Class<T> domainClass);
    RepositoryInformation getRepositoryInformation(RepositoryMetadata metadata);
    Object getTargetRepository(RepositoryInformation metadata);
    <T> T getRepository(Class<T> repositoryInterface, 
            RepositoryInformation metadata, Object target);
}

2.2 代理创建 ​

JpaRepositoryFactory.getRepository:

java
@Override
protected Object getTargetRepository(RepositoryInformation information) {
    EntityManager entityManager = getEntityManager();
    JpaEntityInformation<?, ?> entityInformation = 
            getEntityInformation(information.getDomainType());
    return new SimpleJpaRepository<>(entityInformation, entityManager);
}

🎯 三、方法解析 ​

3.1 方法解析器 ​

QueryLookupStrategy:

java
public interface QueryLookupStrategy {
    RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, 
            ProjectionFactory factory, NamedQueries namedQueries);
}

3.2 查询方法 ​

PartTree:

java
public class PartTree {
    private final Subject subject;
    private final Predicate predicate;
    
    public PartTree(String source, Class<?> domainClass) {
        // 解析方法名
    }
}

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《Spring Data JPA从入门到精通》 - 张振华

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已理解Repository接口体系
  • [ ] 已理解代理生成机制
  • [ ] 已理解方法解析
  • [ ] 已总结核心知识点

上一章节:SpringData源码深度解析概览
下一章节:数据访问抽象
返回目录:源码阅读