乐趣区

关于spring:Spring中国教育管理中心Apache-Cassandra-的-Spring-数据教程十四

14.8.1. 实现实体回调
AnEntityCallback 通过其泛型类型参数间接与其域类型相关联。每个 Spring Data 模块通常带有一组 EntityCallback 涵盖实体生命周期的预约义接口。

例 118. 解剖 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.
    */

T onBeforeSave(T entity <2>, String collection <3>);
}
BeforeSaveCallback 在保留实体之前要调用的特定办法。返回一个可能被批改的实例。

在长久化之前的实体。

许多存储特定参数,例如实体长久化到的汇合。

例 119. 反应式的分析 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.
    */

Publisher<T> onBeforeSave(T entity <2>, String collection <3>);
}
BeforeSaveCallback 在保留实体之前,在订阅时调用的特定办法。收回一个可能被批改的实例。

在长久化之前的实体。

许多存储特定参数,例如实体长久化到的汇合。

可选的实体回调参数由实现 Spring Data 模块定义并从 EntityCallback.callback().

实现适宜您的应用程序需要的接口,如下例所示:

示例 120. 示例 BeforeSaveCallback

class DefaultingEntityCallback implements BeforeSaveCallback<Person>, Ordered {

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

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

return // ...

}

@Override
public int getOrder() {

return 100;                                                                  

}
}
依据您的要求实现回调。

如果存在多个雷同域类型的实体回调,则可能对实体回调进行排序。排序遵循最低优先级。

14.8.2. 注册实体回调
EntityCallback 如果 bean 在 ApplicationContext. 大多数模板 API 曾经实现 ApplicationContextAware,因而能够拜访 ApplicationContext

以下示例解释了一组无效的实体回调注册:

示例 121. EntityCallbackBean 注册示例

@Order(1)
@Component
class First implements BeforeSaveCallback<Person> {

@Override
public Person onBeforeSave(Person person) {

return // ...

}
}

@Component
class DefaultingEntityCallback implements BeforeSaveCallback<Person>,

                                                       Ordered {

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

// ...

}

@Override
public int getOrder() {

return 100;                                                  

}
}

@Configuration
public class EntityCallbackConfiguration {

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

}

@Component
class UserCallbacks implements BeforeConvertCallback<User>,

                                    BeforeSaveCallback<User> {

@Override
public Person onBeforeConvert(User user) {

return // ...

}

@Override
public Person onBeforeSave(User user) {

return // ...

}
}
Spring 中国教育管理中心 -Apache Cassandra 的 Spring 数据教程十四
BeforeSaveCallback 从 @Order 正文中接管其命令。

BeforeSaveCallback 通过 Ordered 接口实现接管其订单。

BeforeSaveCallback 应用 lambda 表达式。默认状况下无序并最初调用。请留神,由 lambda 表达式实现的回调不会公开类型信息,因而应用不可调配的实体调用这些会影响回调吞吐量。应用 classorenum 为回调 bean 启用类型过滤。

在单个实现类中组合多个实体回调接口。

14.8.3. 存储特定的 EntityCallbacks
Spring Data for Apache Cassandra 应用 EntityCallbackAPI 来提供审计反对并对以下回调做出反馈。

Spring 中国教育管理中心 -Apache Cassandra 的 Spring 数据教程十四

  1. Kotlin 反对
    Kotlin 是一种面向 JVM(和其余平台)的动态类型语言,它容许编写简洁优雅的代码,同时提供与用 Java 编写的现有库的杰出互操作性。

Spring Data 为 Kotlin 提供一流的反对,让开发人员简直能够像编写 Kotlin 原生框架一样编写 Kotlin 应用程序。

应用 Kotlin 构建 Spring 应用程序的最简略办法是利用 Spring Boot 及其专用的 Kotlin 反对。本综合教程将教您如何应用 start.spring.io 应用 Kotlin 构建 Spring Boot 应用程序。

15.1. 要求
Spring Data 反对 Kotlin 1.3 并要求 kotlin-stdlib(或其变体之一,例如 kotlin-stdlib-jdk8)和 kotlin-reflect 存在于类门路中。如果您通过 start.spring.io 疏导 Kotlin 我的项目,则默认提供这些。

15.2. 零平安
Kotlin 的要害个性之一是空平安,它 null 在编译时洁净地解决值。这通过可空性申明和“值或无值”语义的表白使应用程序更平安,而无需领取包装器的老本,例如 Optional.(Kotlin 容许应用具备可为空值的函数式结构。请参阅 Kotlin 空值安全性综合指南。)

只管 Java 不容许您在其类型零碎中表白空安全性,但 Spring Data API 应用包中申明的 JSR-305 工具敌对正文进行了正文 org.springframework.lang。默认状况下,来自 Kotlin 中应用的 Java API 的类型被辨认为平台类型,对其进行空查看。Kotlin 对 JSR-305 正文和 Spring 可空性正文的反对为 Kotlin 开发人员提供了整个 Spring Data API 的空平安,具备 null 在编译时解决相干问题的劣势。

请参阅存储库办法的空解决如何将空平安利用于 Spring 数据存储库。

您能够通过增加 -Xjsr305 带有以下选项的编译器标记来配置 JSR-305 查看:-Xjsr305={strict|warn|ignore}.

对于 Kotlin 1.1+ 版本,默认行为与 -Xjsr305=warn. strict 思考到 Spring Data API 空平安,该值是必须的。Kotlin 类型是从 Spring API 推断进去的,但在应用时应该晓得 Spring API 可空性申明能够演变,即便在主要版本之间也是如此,并且未来可能会增加更多查看。

尚不反对通用类型参数、可变参数和数组元素可空性,但应在行将公布的版本中提供。

15.3. 对象映射
无关 Kotlin 对象如何具体化的详细信息,请参阅 Kotlin 反对。

15.4. 扩大
Kotlin 扩大提供了应用附加性能扩大现有类的能力。Spring Data Kotlin API 应用这些扩大为现有的 Spring API 增加新的 Kotlin 特定的便当。

请记住,须要导入 Kotlin 扩大能力应用。与动态导入相似,IDE 应该在大多数状况下主动倡议导入。

例如,Kotlin reified 类型参数为 JVM 泛型类型擦除提供了一种解决办法,Spring Data 提供了一些扩大来利用此性能。这容许更好的 Kotlin API。

要 SWCharacter 在 Java 中检索对象列表,您通常会编写以下内容:

Flux<SWCharacter> characters = template.query(SWCharacter.class).inTable(“star-wars”).all()
应用 Kotlin 和 Spring Data 扩大,您能够改为编写以下内容:

val characters = template.query<SWCharacter>().inTable(“star-wars”).all()
// or (both are equivalent)
val characters : Flux<SWCharacter> = template.query().inTable(“star-wars”).all()
在 Java 中,charactersKotlin 是强类型的,但 Kotlin 奇妙的类型推断容许应用更短的语法。

Spring Data for Apache Cassandra 提供以下扩大:

为具体化泛型的反对 CassandraOperations(包含异步和反馈性的变体),CqlOperations(包含异步和反馈性变体)FluentCassandraOperations,ReactiveFluentCassandraOperations,Criteria,和 Query。
的协程扩大 ReactiveFluentCassandraOperations。
15.5. 协程
Kotlin 协程是轻量级线程,容许强制编写非阻塞代码。在语言方面,suspend 函数为异步操作提供了形象,而在库方面 kotlinx.coroutines 提供了 async {} 像 Flow.

Spring Data 模块在以下范畴内提供对协程的反对:

Kotlin 扩大中的提早和流返回值反对
15.5.1. 依赖关系
协同程序反对时启用 kotlinx-coroutines-core,
kotlinx-coroutines-reactive 而且 kotlinx-coroutines-reactor 依赖在类门路中:

示例 122. 在 Maven pom.xml 中增加的依赖项

<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-core</artifactId>
</dependency>

<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-reactive</artifactId>
</dependency>

<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-reactor</artifactId>
</dependency>
反对的版本 1.3.0 及以上。

15.5.2. 反馈如何转化为协程?
对于返回值,从 Reactive 到 Coroutines API 的转换如下:

fun handler(): Mono<Void> 变成 suspend fun handler()
fun handler(): Mono<T> 成为 suspend fun handler(): T 或 suspend fun handler(): T? 取决于是否 Mono 能够为空(具备更动态类型的长处)
fun handler(): Flux<T> 变成 fun handler(): Flow<T>
FlowFlux 在 Coroutines 世界中是等价的,实用于热流或冷流,无限流或有限流,次要区别如下:

Flow 是基于推的,Flux 而是推拉混合的
背压是通过挂起函数实现的
Flow 只有一个挂起 collect 办法,操作符作为扩大实现
因为协程,运算符易于实现
扩大容许增加自定义运算符 Flow
收集操作正在暂停性能
map 运算符反对异步操作(不须要 flatMap),因为它须要一个挂起函数参数
浏览这篇对于 Going Reactive with Spring、Coroutines 和 Kotlin Flow 的博客文章,理解更多详细信息,包含如何与 Coroutines 并发运行代码。

15.5.3. 存储库
这是一个 Coroutines 存储库的示例:

interface CoroutineRepository : CoroutineCrudRepository<User, String> {

suspend fun findOne(id: String): User

fun findByFirstname(firstname: String): Flow<User>

suspend fun findAllByFirstname(id: String): List<User>

}
协程存储库建设在反应式存储库上,以通过 Kotlin 的协程公开数据拜访的非阻塞个性。协程存储库上的办法能够由查询方法或自定义实现反对。如果自定义办法是可调用的,则调用自定义实现办法会将 Coroutines 调用流传到理论实现办法,suspend 而无需实现办法返回反应类型,例如 Mono 或 Flux。

协程存储库仅在存储库扩大 CoroutineCrudRepository 接口时才被发现。

退出移动版