Spring Data存储库实际上是如何实现的?

Spring Data存储库实际上是如何实现的?,第1张

Spring Data存储库实际上是如何实现的?

首先,没有代码生成正在进行,这意味着:没有CGLib,根本没有字节代码生成。基本方法是使用Spring的

ProxyFactoryAPI
以编程方式创建JDK代理实例以支持该接口,并
MethodInterceptor
拦截所有对该实例的调用并将该方法路由到适当的位置:

  1. 如果存储库已使用自定义实现部分进行了初始化(有关详细信息,请参见参考文档的该部分),并且所调用的方法是在该类中实现的,则将调用路由到那里。
  2. 如果该方法是查询方法(请参阅DefaultRepositoryInformation有关如何确定方法),则商店特定查询执行机制将启动并执行在启动时针对该方法确定要执行的查询。为此,采用了一种解析机制,该机制尝试在各个位置(@Query在方法中,使用JPA命名查询)中标识显式声明的查询,最终退回到从方法名称派生的查询。有关查询机制的检测,请参见
    JpaQueryLookupStrategy
    。可以在中找到查询派生的解析逻辑PartTree。特定于商店的翻译成实际查询可以在中查看
    JpaQueryCreator
  3. 如果以上方法均不适用,则所执行的方法必须是由特定SimpleJpaRepository于商店的存储库基类(在JPA的情况下)实现的,并且将调用路由到该实例的实例中。
    实现该路由逻辑的方法拦截器,
    QueryExecutorMethodInterceptor
    可以在此处找到高级路由逻辑。

这些代理的创建被封装到基于Java的标准Factory模式实现中。可以在中找到高级代理创建

RepositoryFactorySupport
。然后,特定于商店的实现将添加必要的基础结构组件,以便对于JPA而言,您可以继续编写以下代码:

EntityManager em = … // obtain an EntityManagerJpaRepositoryFactory factory = new JpaRepositoryFactory(em);UserRepository repository = factory.getRepository(UserRepository.class);

我明确提到的原因是,应该清楚的是,从根本上讲,该代码中的任何内容都不需要Spring容器来运行。它需要Spring作为类路径上的库(因为我们不想重塑轮子),但是通常与容器无关。

为了简化与DI容器的集成,我们当然要与Spring Java配置,XML名称空间以及CDI扩展进行集成,以便可以在普通CDI场景中使用Spring Data。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4898407.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-12
下一篇2022-11-12

发表评论

登录后才能评论

评论列表(0条)

    保存