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
Spring Data JPA調用存儲過程實例 http://www.linuxidc.com/Linux/2016-01/127007.htm
Spring Data 的詳細介紹:請點這裡
Spring Data 的下載地址:請點這裡