spring-data-jpa源码解析

2,501 阅读1分钟

repository接口如何生成代理bean

时序图

基本流程

  1. @EnableJpaRepositories
    • @Import(JpaRepositoriesRegistrar.class)
  2. JpaRepositoriesRegistrar
    • 指定repository配置类为JpaRepositoryConfigExtension
  3. JpaRepositoryConfigExtension
    • 指定repository工厂类为JpaRepositoryFactoryBean
  4. JpaRepositoryFactoryBean
    • 每个repository对应一个JpaRepositoryFactoryBean
    • afterPropertiesSet方法生成持有的JpaRepositoryFactory
  5. JpaRepositoryFactory

repository方法如何执行的

实现类RepositoryFactorySupport.QueryExecutorMethodInterceptor

  • 构造QueryExecutorMethodInterceptor时会生成自定义finder方法与RepositoryQuery的映射关系
  • 自定义方法实际执行:RepositoryQuery#execute
  • 源码解析:QueryExecutorMethodInterceptor源码

查询解析策略QueryLookupStrategy

  • DeclaredQueryLookupStrategy
    • 解析注解(例如:@Query、@Procedure等)生成对应的RepositoryQuery
  • CreateQueryLookupStrategy
    • 解析方法名生成RepositoryQuery,底层实现类:PartTreeJpaQuery
  • CreateIfNotFoundQueryLookupStrategy
    • 默认值,是上面两个解析策略的结合。先注解,再尝试方法名

repository方法接口RepositoryQuery

  • NativeJpaQuery: @Query(nativeQuery = true)底层实现类
  • SimpleJpaQuery:@Query(nativeQuery = false)底层实现类
  • PartTreeJpaQuery:方法名上没注解时的方法实现类。直接解析方法名

方法名解析流程PartTreeJpaQuery#execute

  • 底层实际执行类QueryImpl

方法名如何解析成PartTree对象