赞
踩
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. */ --------1 T onBeforeSave(T entity, --------2 String 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. */ --------1 Publisher<T> onBeforeSave(T entity, --------2 String collection); --------3 } 1. 在保存实体之前,在subscription上调用BeforeSaveCallback特定的方法。发出一个可能已修改的实例。 2. 就在持久化之前的实体。 3. 许多特定于存储的参数,如实体持久化到的集合。
可选的实体回调参数由实现的Spring Data模块定义,并从EntityCallback.callback()的调用位置推断。
实现适合您的应用程序需求的接口,如下面的示例所示:
示例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. 如果同一域类型存在多个实体回调,则可能会对实体回调进行排序。排序遵循最低优先级。
如果EntityCallback beans在ApplicationContext中注册,则由特定于存储的实现拾取。大多数template API已经实现ApplicationContextAware,因此可以访问ApplicationContext
以下示例解释了有效实体回调注册的集合:
EntityCallback Bean注册示例
@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通过Ordered接口实现接收其顺序。 3. BeforeSaveCallback使用lambda表达式。默认情况下未排序,最后调用。请注意,由lambda表达式实现的回调不会公开类型信息,因此使用不可分配的实体调用这些信息会影响回调吞吐量。使用类或枚举为回调bean启用类型筛选。 4. 在一个实现类中组合多个实体回调接口。
Spring Data Elasticsearch在内部使用EntityCallback API来支持其auditing,并对以下回调做出反应:
表1:支持的实体回调
Callback | Method | Description | Order |
---|---|---|---|
Reactive/BeforeConvertCallback | onBeforeConvert(T entity, IndexCoordinates index) | 在域对象转换为org.springframework.data.elasticsearch.core.document.Document之前调用。可以返回实体或修改后的实体,然后将其转换。 | Ordered.LOWEST_PRECEDENCE |
Reactive/AfterLoadCallback | onAfterLoad(Document document, Class type, IndexCoordinates indexCoordinates) | 在从Elasticsearch得到的结果被读入org.springframework.data.elasticsearch.core.document.Document之后调用。 | Ordered.LOWEST_PRECEDENCE |
Reactive/AfterConvertCallback | onAfterConvert(T entity, Document document, IndexCoordinates indexCoordinates) | 在从Elasticsearch读取结果数据时,从“org.springframework.data.aelasticsearch.core.document.document”转换为域对象后调用。 | Ordered.LOWEST_PRECEDENCE |
Reactive/AuditingEntityCallback | onBeforeConvert(Object entity, IndexCoordinates index) | 标记创建或修改的可审核实体 | 100 |
Reactive/AfterSaveCallback | T onAfterSave(T entity, IndexCoordinates index) | 在保存域对象后调用。 | Ordered.LOWEST_PRECEDENCE |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。