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 的下載地址:請點這裡