|
对于最新稳定版本,请使用Spring Data Elasticsearch 5.5.5! |
实体回调
Spring Data 基础设施为在调用某些方法之前和之后修改实体提供了钩子。
所谓的那些人实体回调实例提供了一种方便的方式,可以以回调方式检查并可能修改实体。
一实体回调看起来几乎像是个专科医师ApplicationListener.
一些 Spring Data 模块发布存储特定事件(例如BeforeSaveEvent)允许修改给定实体。在某些情况下,比如处理不可变类型时,这些事件可能会引发麻烦。
此外,活动发布依赖于ApplicationEventMulticaster.如果用异步配置任务执行者它可能导致不可预测的结果,因为事件处理可以分支到线程上。
实体回调为同步和响应式API提供集成点,确保在处理链中明确定义的检查点实现按顺序执行,返回可能被修改的实体或响应式封装类型。
实体回调通常按API类型分开。这种分离意味着同步 API 只考虑同步实体回调,而响应式实现只考虑响应式实体回调。
|
实体回调API已在Spring Data Commons 2.2中引入。这是应用实体修改的推荐方式。
现有商店专属 |
实现实体回调
一实体回调通过其泛型参数直接关联其域类型。
每个Spring数据模块通常都预先预先定义一套实体回调涵盖实体生命周期的接口。
实体回调@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(). |
实现符合你应用需求的接口,如下面示例所示:
BeforeSaveCallbackclass 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已经实现了应用上下文感知因此能够访问应用上下文
以下示例解释了一组有效的实体回调注册:
实体回调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内部用于审计支持,并对以下回调作出反应:
| 回调 | 方法 | 描述 | 次序 |
|---|---|---|---|
响应式/转换前回调 |
|
在域对象转换为 之前调用 |
|
响应式/加载后回调 |
|
在 Elasticsearch 结果被读取到 |
|
响应式/转换后回调 |
|
在域对象从 转换后调用 |
|
Reactive/AuditingEntity回调 |
|
标记可审计实体的创建或修改 |
100 |
响应式/保存后回调 |
|
在保存域对象后调用。 |
|