• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

Spring JPA

25 Dec 2018

Reading time ~1 minute

JPA配置启动类

和绝大多数的spring组件一样,JPA的启动是从spring.factories开始的,初始化配置类是JpaRepositoriesAutoConfiguration.factories文件是在spring-boot-autoconfigure包中。

接口扫描

spring默认的通过包扫描初始化Bean的方式对接口类型是无效的,所以对于像JPA,Mybatis这类的通过动态代理实现数据查询映射功能的框架,都需要定义自己的包扫描逻辑并实例话Bean然后注册到BeanFactory中。

JPA是通过@Import注解来注入ImportBeanDefinitionRegistrar实现自定义规则的扫描注入。Registrar实现:JpaRepositoriesAutoConfigureRegistrar。

AbstractRepositoryConfigurationSourceSupport实现了registerBeanDefinitions,用以扫描并注册Repository的实例。

动态代理

默认情况下,所有的接口实例均为JpaRepositoryFactoryBean,这是一个FactoryBean,而对于调用getObject方法获取的实际对象实例,则最终通过JpaRepositoryFactory的getRepository方法来生成。

实际的Repository,是通过ProxyFactory生成的一个动态代理类,目标对象是最基本的SimpleJpaRepository。对于JPA中的查询的自动扩展,则是以来一个重要的拦截器QueryExecutorMethodInterceptor,这个拦截器负责初始化方法对应的查询和当前代理类方法调用判断,是否使用生成的查询语句来执行查询逻辑。

当然,对应的查询语句的生成也在QueryExecutorMethodInterceptor里面,这个类会在初始化是将接口的方法根据需要生成对应的RepositoryQuery。

整体流程

对于像JPA或者Mybatis这样的框架,具体的执行逻辑都是通过动态代理来实现,而如果要运行在spring context之上,则需要实现自己的scanner逻辑来进行接口类的扫描和动态代理类的注册,从而可以使用spring ioc的方式来进行Repository的注入和调用。



jpa