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

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

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

例 118. 解剖 EntityCallback

@FunctionalInterface
public interface BeforeSaveCallback extends EntityCallback {

/**

  • 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 extends EntityCallback {

/**

  • 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 onBeforeSave(T entity <2>, String collection <3>);
}
BeforeSaveCallback在保存实体之前,在订阅时调用的特定方法。发出一个可能被修改的实例。

在持久化之前的实体。

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

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

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

示例 120. 示例 BeforeSaveCallback

class DefaultingEntityCallback implements BeforeSaveCallback, 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 {

@Override
public Person onBeforeSave(Person person) {

return // ...

}
}

@Component
class DefaultingEntityCallback implements BeforeSaveCallback,

                                                       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,

                                    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 characters = template.query(SWCharacter.class).inTable("star-wars").all()
使用 Kotlin 和 Spring Data 扩展,您可以改为编写以下内容:

val characters = template.query().inTable("star-wars").all()
// or (both are equivalent)
val characters : Flux = 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 中添加的依赖项


org.jetbrains.kotlinx
kotlinx-coroutines-core


org.jetbrains.kotlinx
kotlinx-coroutines-reactive


org.jetbrains.kotlinx
kotlinx-coroutines-reactor

支持的版本1.3.0及以上。

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

fun handler(): Mono 变成 suspend fun handler()
fun handler(): Mono成为suspend fun handler(): T或suspend fun handler(): T?取决于是否Mono可以为空(具有更静态类型的优点)
fun handler(): Flux 变成 fun handler(): Flow
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接口时才被发现。

相关文章
|
4月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
226 0
|
4月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
115 0
|
4月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
335 0
|
3月前
|
存储 人工智能 数据处理
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
秉承“以场景驱动创新” 的核心理念,持续深耕三大核心场景的关键能力,并对大模型 GenAI 场景的融合应用进行重点投入,为智能时代构建实时、高效、统一的数据底座。
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
|
6月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
2760 65
|
5月前
|
存储 SQL 数据挖掘
数据无界、湖仓无界, Apache Doris 湖仓一体解决方案全面解读(上篇)
湖仓一体架构融合了数据湖的低成本、高扩展性,以及数据仓库的高性能、强数据治理能力,高效应对大数据时代的挑战。为助力企业实现湖仓一体的建设,Apache Doris 提出了数据无界和湖仓无界核心理念,并结合自身特性,助力企业加速从 0 到 1 构建湖仓体系,降低转型过程中的风险和成本。本文将对湖仓一体演进及 Apache Doris 湖仓一体方案进行介绍。
数据无界、湖仓无界, Apache Doris 湖仓一体解决方案全面解读(上篇)
|
5月前
|
存储 运维 监控
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到 50 台服务器, 倒排索引将全文检索性能提升7倍,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
|
6月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
150 21
|
8月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
177 1
|
9月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
96 9

热门文章

最新文章

推荐镜像

更多