写点什么

Pivotal 发布包含反应式数据访问特性的新一代 Spring Data 的第一个里程碑版本

  • 2017-01-24
  • 本文字数:1701 字

    阅读完需:约 6 分钟

Pivotal 最近发布了下一代Spring Data 项目的第一个里程碑版本,他们将其称之为 Release Train Kay 。在发布文档中,这样写到:

这是一个特殊的释放版本,会带领我们驶往新一代的 Spring Data,在前行的过程中也会包含几项破坏性的变更。

重要的变更包括:

选择 MongoDB、Cassandra 和 Redis 的原因在于它们具有实现反应式数据访问的可用驱动。针对这三种数据库,都包含了面向 Reactor 项目 RxJava 的 Spring Data repository 接口。

为了准备 Spring Data 反应式访问 MongoDB 的样例,我们考虑如下的 POJO:

复制代码
public class Person {
private @Id String id;
private final String firstname;
private final String lastname;
}

使用 Reactor 项目的基本反应式 repository 接口可以写成如下所示的样子:

复制代码
public interface ReactivePersonRepository extends ReactiveCrudRepository<Person,String> {
Flux<Person> findByLastname(String lastname);
@Query("{ 'firstname': ?0, 'lastname': ?1}")
Mono<Person> findByFirstnameAndLastname(String firstname,String lastname);
Flux<Person> findByLastname(Mono<String> lastname);
}

这里使用了反应式的类,也就是 Flux<T> Mono<T>,它们可以作为返回类型和参数。

正如最近 InfoQ 上的一篇文章所述

Flux 类似 RxJava 的 Observable,它可以触发零或多个事件,并根据实际情况结束处理或触发错误。

而 Mono 最多只触发一个事件,它对应于 RxJava 的 Single Maybe,所以可以将Mono<Void>用于在异步任务完成时发出通知。

类似的,使用 RxJava 的基础反应式 repository 接口可以写成如下所示的样子:

复制代码
public interface RxJava1PersonRepository extends RxJava1CrudRepository<Person,String> {
Observable<Person> findByLastname(String lastname);
@Query("{ 'firstname': ?0, 'lastname': ?1}")
Single<Person> findByFirstnameAndLastname(String firstname,String lastname);
Observable<Person> findByLastname(Single<String> lastname);
}

激活 Spring Data 反应式 repository 是通过注解完成的,也就是@EnableReactiveMongoRepositories@EnableCassandraRepositories,下面展示了 MongoDB 的样例:

复制代码
@EnableReactiveMongoRepositories
@AutoConfigreAfter(EmbeddedMongoAutoConfiguration.class)
class ApplicationConfiguration extended AbstractReactiveMongoConfiguration {
@Bean
public LoggingEventListener mongoEventListener() {
return new LoggingEventListener();
}
@Override
@Bean
public MongoClient mongoClient() {
return MongoClients.create();
}
@Override
protected String getDatabaseName() {
return "reactive";
}
}

类似于构建传统数据操作的模板,反应式模板也可以写成如下所示:

复制代码
public interface ReactiveMongoOperations {
// 其他操作……
<T> Mono<T> findOne(Query query,Class<T> entityClass);
<T> Flux<T> find(Query query,Class<T> entityClass);
<T> Mono<T> insert(T objectToSave,String collectionName);
<T> Mono<T> insert(Mono<? extends T> objectToSave);
}

数据同样可以通过模板进行插入:

复制代码
Flux<Person> flux = Flux.just(new Person("Vincent","Vega"),
new Person("Jules","Winnfield"),
new Person("Marsellus","Wallace"),
new Person("Mia","Wallace"));
template.insertAll(flux).subscribe();

完整的 Spring Data 反应式 MongoDB 项目可以在 GitHub 上找到。

相关资源

关于反应式编程的更多详细信息可以通过如下的文章来获取:

查看英文原文 Pivotal Releases First Milestone of Next-Generation Spring Data Featuring Reactive Database Access

2017-01-24 18:002313

评论

发布
暂无评论
发现更多内容

一夜爆火,只因阿里内部作为参考的SpringBoot巅峰之作git开源

小Q

Java 架构 面试 微服务 springboot

译文|简明指南:Apache Pulsar 的分层存储

Apache Pulsar

开源 云原生 存储分离 Apache Pulsar 消息中间件

船长梁晓玲的猎鹰号真的能赚钱嘛?不分析不知道……

成周

心理学 船长梁晓玲 诈骗

一个草根的日常杂碎(9月22日)

刘新吾

生活 随笔 记录

判断一个请求是否是Ajax异步请求

麦洛

ajax

LeetCode题解:145. 二叉树的后序遍历,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

网站日志分析最完整实践

MySQL从删库到跑路

第6周作业

方堃

c++杂谈-1

菜鸟小sailor 🐕

c++

架构师训练营 1 期第 2 周:框架设计 - 作业

piercebn

极客大学架构师训练营

架构师训练营 - 第 2 周课后作业(1 期)

阿甘

微前端qiankun从搭建到部署的实践

fengxianqi

大前端 微应用

第2周

Geek_fabd84

时空碰撞优化系列·二

誓约·追光者

hive Sparksql 计算效率 优化

高并发下为什么更喜欢进程内缓存

架构师修行之路

缓存 架构设计

oeasy 教您玩转 linux 010400 总结 summary

o

看动画学算法之:排序-count排序

程序那些事

动画 看动画学算法 看动画学数据结构 count排序

响应式编程到底是什么?

博文视点Broadview

Java 响应式 响应式编程 reactor 并发

架构师训练营第 1 期 -week2

习习

解Bug之路-记一次对端机器宕机后的tcp行为

无毁的湖光

Linux TCP socket MQ Java 分布式

分布式高并发下Actor模型如此优秀

架构师修行之路

系统设计 reactor 高并发

第7周作业

Vincent

极客时间 极客大学

Redis 发布订阅,小功能大用处,真没那么废材!

楼下小黑哥

Java redis spring

甲方日常 20

句子

工作 随笔杂谈 日常 Java 25 周年

Spring系列之新注解配置+Spring集成junit+注解注入

Java spring 微服务 架构师

架构师训练营 - 第 2 周学习总结(1 期)

阿甘

第7周的总结

Vincent

极客时间 极客大学

超越色彩的魅力:读《黑白适界》

北风

艺术 摄影 黑白 摄影征文 画册

众盟科技2020智能化白皮书:穿越新商业周期,读懂商业智能化的真义

脑极体

救人于无形的“环境智能”,到底是一种什么智能?

脑极体

Pivotal发布包含反应式数据访问特性的新一代Spring Data的第一个里程碑版本_Java_Michael Redlich_InfoQ精选文章