歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Pivotal發布包含反應式數據訪問特性的新一代Spring Data的第一個裡程碑版本

Pivotal發布包含反應式數據訪問特性的新一代Spring Data的第一個裡程碑版本

日期:2017/3/1 9:06:07   编辑:Linux編程

Pivotal最近發布了下一代Spring Data項目的第一個裡程碑版本,他們將其稱之為Release Train Kay。在發布文檔中,這樣寫到:

這是一個特殊的釋放版本,會帶領我們駛往新一代的Spring Data,在前行的過程中也會包含幾項破壞性的變更。

重要的變更包括:

  • 基礎設施升級,完全支持:
    • Java 8
    • Spring 5
  • 對如下數據庫提供了反應式(Reactive)支持:
    • MongoDB
    • Apache Cassandra
    • Redis
  • 廢棄了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的SingleMaybe,所以可以將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

Spring Data JPA調用存儲過程實例 http://www.linuxidc.com/Linux/2016-01/127007.htm

Spring Data 的詳細介紹:請點這裡
Spring Data 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved