Pivotal 最近发布了下一代Spring Data 项目的第一个里程碑版本,他们将其称之为 Release Train Kay 。在发布文档中,这样写到:
这是一个特殊的释放版本,会带领我们驶往新一代的 Spring Data,在前行的过程中也会包含几项破坏性的变更。
重要的变更包括:
- 基础设施升级,完全支持:
- Java 8
- Spring 5
 
- 对如下数据库提供了反应式(Reactive)支持:
- 废弃了 JRedis 和 SRP 驱动
选择 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 上找到。
相关资源
关于反应式编程的更多详细信息可以通过如下的文章来获取:
- Victor Grazi 所撰写的 RxJava 样例文章;
- Simon Baslé撰写的 Reactor 样例文章;
- Pivotal借助 Spring Data 实现反应式编程的博客文章;
- GitHub 上所有 Spring Data 的样例
查看英文原文: Pivotal Releases First Milestone of Next-Generation Spring Data Featuring Reactive Database Access











 
    
评论