Spring Data Moore有哪些新功能? - spring.io

banq發表於2019-10-12

全面的大量新功能,尤其是Reactive,Kotlin和Performance。包括整個產品組合中的大量改進和新功能,並且重點關注三個主要主題:Reactive,Kotlin和Performance。該版本增加了宣告式反應式事務和協程/流程支援等功能,並提供了高達60%*更快的查詢器方法。

讓我們從Moore的一些Reactive功能開始。

宣告式Reactive事務

Lovelace發行版封閉式的方式引入了對響應式事務的早期支援,從而留出了一些改進的空間。以下清單顯示了該樣式:
Lovelace中的反應式事務(使用MongoDB)

public Mono<Process> doSomething(Long id) {

  return template.inTransaction().execute(txTemplate -> {

    return txTemplate.findById(id)
      .flatMap(it -> start(txTemplate, it))
      .flatMap(it -> verify(it))
      .flatMap(it -> finish(txTemplate, it));

  }).next();
}

在前面的程式碼段中,必須透過inTransaction()在閉包內使用可識別事務的模板顯式呼叫來啟動事務,最後呼叫next()以將返回值Flux轉換為a Mono來滿足方法簽名,即使findById(…)已經僅發出一個元素。

顯然,這不是進行反應式事務的最直觀的方法。因此,讓我們看看使用宣告式反應式事務支援的相同流程。與Spring的事務支援一樣,您需要一個元件來為您處理交易。對於反應式事務,
ReactiveTransactionManager是由MongoDB和R2DBC模組提供。以下清單顯示了這樣的元件:
@EnableTransactionManagement
class Config extends AbstractReactiveMongoConfiguration {

  // …

  @Bean
  ReactiveTransactionManager mgr(ReactiveMongoDatabaseFactory f) {
    return new ReactiveMongoTransactionManager(f);
  }
}

在這裡,您可以使用@Transactional基礎結構來註釋方法,並依靠該基礎結構來啟動,提交和回滾事務流,以透過Reactor Context處理生命週期。這可以讓你把程式碼從Lovelace轉換成以下方法,刪除與它的作用域模板和多餘的封閉的需要Flux來Mono改造:

Declarative Reactive Transactions in Moore (with MongoDB)

@Transactional
public Mono<Process> doSomething(Long id) {

  return template.findById(id)
    .flatMap(it -> start(template, it))
    .flatMap(it -> verify(it))
    .flatMap(it -> finish(template, it));
}


響應式Elasticsearch儲存庫
Spring Data Elasticsearch現在提供了反應性模板和儲存庫支援,該支援基於完全基於反應式Elasticsearch REST客戶端而又基於Spring的REST客戶端構建WebClient。
該客戶端透過在Java High-Level REST Client附近公開一個熟悉的API,為日常搜尋操作提供一流的支援,並在需要時進行必要的削減。模板和儲存庫API的組合使您可以根據需要無縫過渡到響應式而不會迷失方向。以下清單顯示瞭如何配置Elasticsearch以使用反應式客戶端:

class Config extends AbstractReactiveElasticsearchConfiguration {

  // …

  @Bean
  public ReactiveElasticsearchClient reactiveClient() {
    return ReactiveRestClients.create(localhost());
  }
}

@Autowired
ReactiveElasticsearchTemplate template;

//…

Criteria criteria = new Criteria("topics").contains("spring")
    .and("date").greaterThanEqual(today())

Flux<Conference> result = template.find(new CriteriaQuery(criteria), Conference.class);


反應式查詢

Querydsl提供了一種出色的方式來定義多個資料儲存的型別安全查詢,並且已經有相當長的一段時間支援非反應性資料訪問。為了在響應式場景中提供支援,我們新增了響應式執行層,可讓您執行Predicate支援的查詢。的ReactiveQuerydslPredicateExecutor,當新增到儲存庫介面,提供了所有的入口點,如下面的示例所示:

interface SampleRepository extends …, ReactiveQuerydslPredicateExecutor<…> {
  // …
}

@Autowired
SampleRepository repository;

// …
Predicate predicate = QCustomer.customer.lastname.eq("Matthews");
Flux<Customer> result = repository.findAll(predicate);


支援Kotlin協程和MongoDB標準API DSL

點選標題見原文

效能提升
基準測試顯示JPA單屬性查詢器方法(例如findByTitle(…))的吞吐量提高了近60%

實體回撥API

支援Redis流​​​​​​​

JPA儲存過程的多個輸出引數​​​​​​​


@NamedStoredProcedureQuery(name = "User.s1p", procedureName = "s1p",
  parameters = {
    @StoredProcedureParameter(mode = IN, name = "in_1", type = …),
    @StoredProcedureParameter(mode = OUT, name = "out_1", type = …),
    @StoredProcedureParameter(mode = OUT, name = "out_2", type = …)})
@Table(name = "SD_User")
class User { … }

interface UserRepository extends JpaRepository<…> {

  @Procedure(name = "User.s1p")
  Map<String, Integer> callS1P(@Param("in_1") Integer arg);
}


關於儲存庫方法的宣告性MongoDB聚合
使用MongoDB,複雜的資料處理是透過聚合來完成的,對於這些聚合,Spring Data提供了一個特定的(流利的)API,並對操作和表示式進行了抽象。但是,Stackoverflow告訴我們人們傾向於在命令列上進行聚合,然後將其轉換為Java程式碼。該翻譯原來是一個主要的痛點。因此,我們藉此機會介紹@Aggregation了一種在儲存庫方法中執行聚合的直接方法。以下示例顯示瞭如何執行此操作:
宣告式MongoDB聚合:

interface OrderRepository extends CrudRepository<Order, Long> {

  @Aggregation("{ $group : { _id : '$cust_id', total : { $sum : '$amount' }}}")
  List<TotalByCustomer> totalByCustomer(Sort sort);

  @Aggregation(pipeline = {
    "{ $match : { customerId : ?0 }}",
    "{ $count : total }"
  })
  Long totalOrdersForCustomer(String customerId);
}


@Aggregation像它的親戚@Query註釋一樣支援引數替換,並且如果由查詢方法引數提供,則對聚合新增排序,如前面的示例所示。

還有更多

  • Gemfire / Apache Geode:改進的SSL支援和動態埠配置
  • JDBC:只讀屬性,SQL生成和可嵌入的載入選項
  • REST:利用HATEOAS 1.0及其中所有有趣的東西!
  • MongoDB:響應式GridFS,宣告式排序規則支援和JSON模式生成器
  • neo4j:空間型別和存在預測
  • Apache Cassandra:範圍查詢,樂觀鎖定和審計支援
  • Redis:叢集快取和非阻塞連線方法
  • Elasticsearch:高階REST客戶端支援和非基於Jackson的實體對映

​​​​​​​點選標題見原文

相關文章