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