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的實體對映
點選標題見原文
相關文章
- Spring Modulith 1.3 有哪些新功能?Spring
- 在Spring Data MongoDB中實現關係建模 - spring.ioSpringMongoDB
- Spring Data JDBC如何對DDD聚合根進行部分更新? - spring.ioSpringJDBC
- Spring Cloud Stream事件路由 - spring.ioSpringCloud事件路由
- Spring Cloud Gateway入門 - spring.ioSpringCloudGateway
- 更快更省:帶有新AOT引擎的Spring Native 0.11 釋出 - spring.ioSpring
- 重要版本Spring Boot 2.3.0釋出 - spring.ioSpring Boot
- 最新版的MindManager 有哪些新功能
- Java 20中有哪些新功能? - symflowerJava
- RSocket入門:Spring Boot伺服器 -Spring.ioSpring Boot伺服器
- Design a Moore FSM
- Node.js 21中有哪些最新功能?Node.js
- Spring Boot 2.2中有什麼新功能? - oioSpring Boot
- xcode 12有哪些改動?xcode 12新功能介紹XCode
- 小米MIUI10十大新功能彙總 MIUI10有哪些新功能?UI
- Spring Data JpaSpring
- Spring Security 6.3 新功能Spring
- Spring Data JPA之Spring Data JPA快速入門(三)Spring
- WebClient: Spring的新的HTTP反應式客戶端 - spring.ioWebclientSpringHTTP客戶端
- Spring Boot:整合Spring Data JPASpring Boot
- Spring Data Jpa APISpringAPI
- Spring Data 教程 - RedisSpringRedis
- 使用 Spring Data RepositoriesSpring
- Spring Boot應用程式有哪些功能?Spring Boot
- Spring中Bean的作用域有哪些?SpringBean
- spring boot的常用註解有哪些?Spring Boot
- 通往Spring Boot本機應用的道路:Spring GraalVM Native 0.7.0可以使用了 - spring.ioSpring BootLVM
- 大資料data開發有哪些好的輔助工具?大資料
- 新功能指南 | 快來看看 OCP V3.1.1 有哪些驚喜!
- C#12新功能有哪些?C#
- Spring Boot從2.3.0M1開始使用Gradle而不是Maven了 - spring.ioSpring BootGradleMaven
- Spring Data JPA 的使用Spring
- Spring Data JDBC介紹SpringJDBC
- Spring Data JPA中TransactionInterceptorSpring
- Spring Data JPA中ConfigurableTransactionManagerSpring
- spring data jpa查詢Spring
- SpringBoot整合Spring Data JPASpring Boot
- Spring Data JPA:解析SimpleJpaRepositorySpring