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


全面的大量新功能,尤其是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的实体映射

​​​​​​​点击标题见原文