该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用Spring Data Elasticsearch 5.5.5spring-doc.cadn.net.cn

实体回调

Spring Data 基础设施为调用某些方法前后修改实体提供了钩子。所谓的实体回调实例提供了一种方便的方式,可以以回调方式检查并可能修改实体。
实体回调看起来几乎像是个专科医师ApplicationListener. 一些 Spring Data 模块发布存储特定事件(例如BeforeSaveEvent)允许修改给定实体。在某些情况下,比如处理不可变类型时,这些事件可能会带来麻烦。此外,事件发布依赖于ApplicationEventMulticaster. 如果用异步配置任务执行者它可能导致不可预测的结果,因为事件处理可以分支到线程上。spring-doc.cadn.net.cn

实体回调为同步和响应式API提供集成点,确保在处理链中明确定义的检查点实现按顺序执行,返回可能被修改的实体或响应式封装类型。spring-doc.cadn.net.cn

实体回调通常按 API 类型分开。这种分离意味着同步 API 只考虑同步实体回调,而响应式实现只考虑响应式实体回调。spring-doc.cadn.net.cn

实体回调API已随Spring Data Commons 2.2引入。这是应用实体修改的推荐方式。现有存储专用应用事件在可能注册的调用之前仍然被发布实体回调实例。spring-doc.cadn.net.cn

实现实体回调

实体回调通过其泛型参数直接关联其域类型。每个Spring Data模块通常会预先预定义实体回调涵盖实体生命周期的接口。spring-doc.cadn.net.cn

解剖学实体回调
@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.
	 */
	(1)
	T onBeforeSave(T entity, (2)
		String collection); (3)
}
1 BeforeSaveCallback在保存实体之前调用的特定方法。返回一个可能被修改的实例。
2 那个存在,紧接着坚持。
3 许多存储特定的参数,比如实体被持久化到的集合
反应性的解剖结构实体回调
@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.
	 */
	(1)
	Publisher<T> onBeforeSave(T entity, (2)
		String collection); (3)
}
1 BeforeSaveCallback在实体保存之前,订阅时调用的特定方法。会发出一个可能被修改的实例。
2 那个存在,紧接着坚持。
3 许多存储特定的参数,比如实体被持久化到的集合
可选的实体回调参数由实现的Spring数据模块定义,并从调用站点推断出EntityCallback.callback().

实现符合你应用需求的接口,如下面示例所示:spring-doc.cadn.net.cn

示例BeforeSaveCallback
class DefaultingEntityCallback implements BeforeSaveCallback<Person>, Ordered {      (2)

	@Override
	public Object onBeforeSave(Person entity, String collection) {                   (1)

		if(collection == "user") {
		    return // ...
		}

		return // ...
	}

	@Override
	public int getOrder() {
		return 100;                                                                  (2)
	}
}
1 根据您的需求实现回调。
2 如果存在多个针对同一域类型的回调,可以对实体进行回调。排序遵循最低优先级。

注册实体回调

实体回调如果豆子注册在应用上下文. 大多数模板API已经实现了应用上下文感知因此能够访问应用上下文spring-doc.cadn.net.cn

以下示例解释了一组有效的实体回调注册:spring-doc.cadn.net.cn

示例实体回调Beans注册
@Order(1)                                                           (1)
@Component
class First implements BeforeSaveCallback<Person> {

	@Override
	public Person onBeforeSave(Person person) {
		return // ...
	}
}

@Component
class DefaultingEntityCallback implements BeforeSaveCallback<Person>,
                                                           Ordered { (2)

	@Override
	public Object onBeforeSave(Person entity, String collection) {
		// ...
	}

	@Override
	public int getOrder() {
		return 100;                                                  (2)
	}
}

@Configuration
public class EntityCallbackConfiguration {

    @Bean
    BeforeSaveCallback<Person> unorderedLambdaReceiverCallback() {   (3)
        return (BeforeSaveCallback<Person>) it -> // ...
    }
}

@Component
class UserCallbacks implements BeforeConvertCallback<User>,
                                        BeforeSaveCallback<User> {   (4)

	@Override
	public Person onBeforeConvert(User user) {
		return // ...
	}

	@Override
	public Person onBeforeSave(User user) {
		return // ...
	}
}
1 BeforeSaveCallback收到来自@Order注解。
2 BeforeSaveCallback通过命令接口实现。
3 BeforeSaveCallback使用λ表达式。默认为无序,最后调用。注意,由λ表达式实现的回调不会暴露类型信息,因此使用不可分配实体调用回调会影响回调吞吐量。使用枚举以启用回调豆的类型过滤。
4 将多个实体回调接口合并到一个实现类别中。

存储特定实体回调

Spring Data Elasticsearch 使用实体回调API内部用于审计支持,并对以下回调作出反应:spring-doc.cadn.net.cn

表1。支持的实体回调
回调 方法 描述 次序

响应式/转换前回调spring-doc.cadn.net.cn

onBeforeConvert(T 实体,Index坐标索引)spring-doc.cadn.net.cn

在域对象转换为 之前调用org.springframework.data.elasticsearch.core.document.Document. 可以退还实体或者是一个修改后的实体,然后被转换。spring-doc.cadn.net.cn

Ordered.LOWEST_PRECEDENCEspring-doc.cadn.net.cn

响应式/加载后回调spring-doc.cadn.net.cn

onAfterLoad(文档文档,类类<T>类型,Index坐标索引坐标)spring-doc.cadn.net.cn

在 Elasticsearch 结果被读取到org.springframework.data.elasticsearch.core.document.Document.spring-doc.cadn.net.cn

Ordered.LOWEST_PRECEDENCEspring-doc.cadn.net.cn

响应式/转换后回调spring-doc.cadn.net.cn

onAfterConvert(T 实体,文档文档,索引坐标索引坐标)spring-doc.cadn.net.cn

在域对象从 转换后调用org.springframework.data.elasticsearch.core.document.Document读取Elasticsearch的结果数据。spring-doc.cadn.net.cn

Ordered.LOWEST_PRECEDENCEspring-doc.cadn.net.cn

Reactive/AuditingEntity回调spring-doc.cadn.net.cn

onBeforeConvert(对象实体,IndexCoordinates 索引)spring-doc.cadn.net.cn

标记可审计实体的创建修改spring-doc.cadn.net.cn

100spring-doc.cadn.net.cn

响应式/保存后回调spring-doc.cadn.net.cn

T onAfterSave(T 实体,Index坐标索引)spring-doc.cadn.net.cn

在保存域对象后调用。spring-doc.cadn.net.cn

Ordered.LOWEST_PRECEDENCEspring-doc.cadn.net.cn