Spring Data访问Elasticsearch----实体回调Entity Callbacks

Spring Data访问Elasticsearch----实体回调Entity Callbacks

  • 一、实现实体回调
  • 二、注册实体回调
  • 三、存储特定的EntityCallbacks

Spring Data基础结构提供了钩子,用于在调用某些方法之前和之后修改实体。这些所谓的EntityCallback实例提供了一种方便的方式来检查并可能以回调风格修改实体。
EntityCallback看起来很像一个专门的ApplicationListener。一些Spring Data模块发布特定于存储的事件(如BeforeSaveEvent),允许修改给定的实体。在某些情况下,例如在处理不可变类型时,这些事件可能会造成麻烦。此外,事件发布依赖于ApplicationEventMulticaster。如果使用异步TaskExecutor进行配置,可能会导致不可预测的结果,因为事件处理可能会分叉到线程上。
实体回调为同步API和反应式(reactive)API提供了集成点,以保证在处理链中定义良好的检查点(checkpoints)按顺序执行,从而返回可能修改的实体或反应式包装器类型。
实体回调通常由API类型分隔。这种分离意味着同步API只考虑同步实体回调,而反应式实现只考虑反应式实体回调。
实体回调API是在Spring Data Commons 2.2中引入的。这是应用实体修改的推荐方式。在调用可能注册的EntityCallback实例之前,仍会发布现有的特定于存储的ApplicationEvents。

一、实现实体回调

EntityCallback通过其泛型类型参数与其域类型直接关联。每个Spring Data模块通常附带一组覆盖实体生命周期的预定义EntityCallback接口。
EntityCallback的剖析

@FunctionalInterface
public interface BeforeSaveCallback<T> extends EntityCallback<T> {/*** Entity callback method invoked before a domain object is saved.* Can return either the same or a modified instance.** @return the domain object to be persisted.*/--------1T onBeforeSave(T entity, --------2String collection);  --------3
}1. 在保存实体之前调用的BeforeSaveCallback特定方法。返回一个可能被修改的实例。
2. 持久化之前的实体。
3. 许多存储特定的参数,如实体持久化到的集合。

反应式的EntityCallback剖析

@FunctionalInterface
public interface ReactiveBeforeSaveCallback<T> extends EntityCallback<T> {/*** Entity callback method invoked on subscription, before a domain object is saved.* The returned Publisher can emit either the same or a modified instance.** @return Publisher emitting the domain object to be persisted.*/--------1Publisher<T> onBeforeSave(T entity, --------2String collection);             --------3
}1. 在保存实体之前,在subscription上调用BeforeSaveCallback特定的方法。发出一个可能已修改的实例。
2. 就在持久化之前的实体。
3. 许多特定于存储的参数,如实体持久化到的集合。

可选的实体回调参数由实现的Spring Data模块定义,并从EntityCallback.callback()的调用位置推断。
实现适合您的应用程序需求的接口,如下面的示例所示:
示例BeforeSaveCallback

class DefaultingEntityCallback implements BeforeSaveCallback<Person>, Ordered { --------2     @Overridepublic Object onBeforeSave(Person entity, String collection) {              --------1     if(collection == "user") {return // ...}return // ...}@Overridepublic int getOrder() {return 100;                                                              --------2    }
}1. 根据你的要求实施回调。
2. 如果同一域类型存在多个实体回调,则可能会对实体回调进行排序。排序遵循最低优先级。

二、注册实体回调

如果EntityCallback beans在ApplicationContext中注册,则由特定于存储的实现拾取。大多数template API已经实现ApplicationContextAware,因此可以访问ApplicationContext
以下示例解释了有效实体回调注册的集合:
EntityCallback Bean注册示例

@Order(1)                                                            --------1
@Component
class First implements BeforeSaveCallback<Person> {@Overridepublic Person onBeforeSave(Person person) {return // ...}
}@Component
class DefaultingEntityCallback implements BeforeSaveCallback<Person>,Ordered { --------2@Overridepublic Object onBeforeSave(Person entity, String collection) {// ...}@Overridepublic int getOrder() {return 100;                                                  --------2}
}@Configuration
public class EntityCallbackConfiguration {@BeanBeforeSaveCallback<Person> unorderedLambdaReceiverCallback() {   --------3return (BeforeSaveCallback<Person>) it -> // ...}
}@Component
class UserCallbacks implements BeforeConvertCallback<User>,BeforeSaveCallback<User> {   --------4@Overridepublic Person onBeforeConvert(User user) {return // ...}@Overridepublic Person onBeforeSave(User user) {return // ...}
}1. BeforeSaveCallback@Order注解接收其顺序。
2. BeforeSaveCallback通过Ordered接口实现接收其顺序。
3. BeforeSaveCallback使用lambda表达式。默认情况下未排序,最后调用。请注意,由lambda表达式实现的回调不会公开类型信息,因此使用不可分配的实体调用这些信息会影响回调吞吐量。使用类或枚举为回调bean启用类型筛选。
4. 在一个实现类中组合多个实体回调接口。

三、存储特定的EntityCallbacks

Spring Data Elasticsearch在内部使用EntityCallback API来支持其auditing,并对以下回调做出反应:
表1:支持的实体回调

CallbackMethodDescriptionOrder
Reactive/BeforeConvertCallbackonBeforeConvert(T entity, IndexCoordinates index)在域对象转换为org.springframework.data.elasticsearch.core.document.Document之前调用。可以返回实体或修改后的实体,然后将其转换。Ordered.LOWEST_PRECEDENCE
Reactive/AfterLoadCallbackonAfterLoad(Document document, Class type, IndexCoordinates indexCoordinates)在从Elasticsearch得到的结果被读入org.springframework.data.elasticsearch.core.document.Document之后调用。Ordered.LOWEST_PRECEDENCE
Reactive/AfterConvertCallbackonAfterConvert(T entity, Document document, IndexCoordinates indexCoordinates)在从Elasticsearch读取结果数据时,从“org.springframework.data.aelasticsearch.core.document.document”转换为域对象后调用。Ordered.LOWEST_PRECEDENCE
Reactive/AuditingEntityCallbackonBeforeConvert(Object entity, IndexCoordinates index)标记创建或修改的可审核实体100
Reactive/AfterSaveCallbackT onAfterSave(T entity, IndexCoordinates index)在保存域对象后调用。Ordered.LOWEST_PRECEDENCE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用于 Windows电脑的 iPad 数据恢复软件

如何在 Windows 11/10/8/7 上从 iPad 恢复丢失的数据&#xff1f;其实很简单。您只需在 Windows 11/10/8/7 上下载并安装 iPad 数据恢复软件。然后您可以运行该软件扫描您的 iPad 并查找已删除/丢失的数据。iPad 中的 iOS 数据&#xff08;包括消息、聊天记录、联系人、照片和视…

类和对象 java 要点总结

# 类和对象 - 成员变量 有默认值0 - 成员方法 - 类名&#xff1a;大驼峰 - rename refactor 改类名 - new 实例化对象 - this 当前对象的引用 - this共有2种使用方式&#xff1a; - this.data 访问当前对象的实例成员变量 - this.func() 访问当前对象的实例成员方法 - t…

Vue学习日记 Day7 —— json-server工具、基于VueCli自定义创建项目、postcss插件

一、前一天Vuex总结 1、state作用&#xff1a;存放数据定义&#xff1a;state:{//数据 }使用&#xff1a;//放在data下(1)根节点直接访问this.$store.state.数据名(2)模块直接访问this.$store.state.模块名.数据名(3)根节点辅助函数mapState([所需要的数据])(4)模块辅助…

CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记

CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记 文章目录 CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记前记获取键值或下标的方式获取属性的方式 Level 1 no wafLevel 2 bl[\{\{]Level 3 no waf and blindLevel 4 bl[[, ]]获取键值或下标 Level 5 bl[\, "]Level 6 bl[_]Level …

Java安全基础 必备概念理解

Java安全基础 关键概念汇总 文章目录 Java安全基础 关键概念汇总前置知识1.构造器this以及包的使用2.继承3.重写/ 重载 / super4.多态5.区分和equals方法6.toString的使用7.Object的概念8.static,final,代码块static代码块final 9.动态代理10.类的动态加载1)类加载器含义&#…

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

【InternLM 笔记】OpenXLAB浦源的基本操作

OpenXLab网址 网址&#xff1a;OpenXLab浦源 模型 创建模型 页面右上角选择【创建】然后选择【创建模型】 创建模型的页面如下 感觉页面中的提示信息填写相应的内容&#xff0c;全部填完后点页面下方的【立即创建】完成模型的创建 模型上传 安装所需的工具 apt install …

目标检测——玉米叶感染数据集

一、重要性 首先&#xff0c;玉米作为世界上重要的粮食作物之一&#xff0c;其生长状况直接影响到粮食产量和粮食安全。玉米叶感染是玉米生长过程中常见的病害之一&#xff0c;会导致玉米叶片出现肿胀、皱缩、扭曲变形等症状&#xff0c;严重时甚至可能形成瘤状物。因此&#…

MySQL特殊函数

MySQL提供了一系列特殊函数&#xff0c;用于执行各种操作&#xff0c;包括数学运算、字符串处理、日期和时间计算等。下面是一些常用的MySQL特殊函数及其样例&#xff1a; 1. **数学函数**&#xff1a; - ABS(x)&#xff1a;返回x的绝对值。 - 样例&#xff1a;SELECT AB…

plsql如何添加索引?

索引是对表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她&#xff0c;则与在表中搜索所有的行相比&#xff0c;索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据的方法&#xf…

【LIMS】微服务

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因&#xff08;基于Spring Cloud Alibaba的试用场景&#xff09;1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎&#xff0c;根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…

Python实现视频转音频、音频转文本加文本实体识别

文章目录 概述必备第三方库视频转音频音频转文字完整代码命名实体识别NER注意点概述 本教程希望可以识别出目前活跃的视频平台(例如抖音、快手等)中视频文案中蕴含的实体信息,首先有两条技术路径: 直接提取视频帧,之后实现逐帧的字幕识别,最后合并为视频文案。 优点:准…

为什么Python语言那么受欢迎呢?

Python语言受到广泛欢迎的原因有很多。首先&#xff0c;让我们来了解一下Python语言的背景和历史。Python是由Guido van Rossum在上世纪90年代初开发的一种高级编程语言。自从他在1989年发布第一个Python解释器以来&#xff0c;Python一直在不断发展和完善。其简洁、易读的语法…

js获取年月日

const date new Date()const options { year: numeric, month: 2-digit, day: 2-digit }const dateString date.toLocaleDateString(zh-CN, options)const [year, month, day] dateString.split(/)console.log(year, month, day) 人工智能学习网站&#xff1a; https://ch…

C++ 中的 Pimpl 惯用法

Pimpl 是一种常见的 C 设计模式&#xff0c;用于隐藏类的实现细节&#xff0c;从而减少编译依赖和提高编译速度。本文将通过一个较为复杂的例子&#xff0c;展示如何使用智能指针&#xff08;如 std::unique_ptr&#xff09;来实现 Pimpl 惯用法。 参考: Pimpl 用法

ArcGIS Pro 和 ArcMap 10个不同

ArcGIS Pro 和 ArcMap 都是 ESRI 开发的地理信息系统 (GIS) 软件,但它们在设计、功能和用户体验方面有一些显著的区别。以下是 ArcGIS Pro 和 ArcMap 之间的 10 个主要不同点: 界面和用户体验: ArcGIS Pro 采用了现代化的、基于Ribbon的界面,与 Microsoft Office 应用程序相…

在 Mac 上通过“启动转换助理”安装 Windows 10

在 Mac 上通过“启动转换助理”安装 Windows 10 你可以通过“启动转换”在 Mac 上安装 Microsoft Windows 10&#xff0c;然后在重新启动 Mac 时在 macOS 和 Windows 之间进行切换。 在 Mac 上安装 Windows 10 需要满足的条件 只有在搭载 Intel 处理器的 Mac 上才能使用“启…

Kubernetes 项目整体布局 el-container

整体布局整体布局 你可能会去敲不同的项目&#xff0c;有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的&#xff0c;边框架子都是相同的。其实框架是不怎么变化的&#xff0c;变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…

高效求解!图片转换方法大揭秘,清晰度零损失!

在数字时代&#xff0c;图片转换是我们处理和共享图像时经常面临的任务之一。随着不同平台、应用程序和需求的不断增多&#xff0c;高效的图片转换方法变得至关重要。本文将为您揭秘一系列高效的图片转换方法&#xff0c;确保在转换过程中清晰度零损失。 无论是为了适应不同的…

Docker Desktop 安装 ClickHouse 超级简单教程

Docker desktop 安装 clickhouse 超级简单 文章目录 Docker desktop 安装 clickhouse 超级简单 什么是 Docker &#xff1f;安装下准备安装Docker配置安装 ClickHouse配置数据库密码DBeaver 测试创建表总结 什么是 Docker &#xff1f; 下载 Docker desktop Docker Desktop …