spring-webflux
зависит от reactor-core
и использует его на внутреннем уровне для формулирования асинхронной логики и обеспечения поддержки Reactive Streams. Как правило, WebFlux API возвращают Flux
или Mono
(поскольку они используются на внутреннем уровне) и с опережением принимают на ввод любую реализацию Publisher
из спецификации Reactive Streams. Использование Flux
в сравнении с Mono
важно, поскольку помогает выразить мощность множества – например, ожидается ли одно или несколько асинхронных значений, что может быть важно для принятия решений (например, при кодировании или декодировании HTTP-сообщений).
В случае с аннотированными контроллерами WebFlux легко адаптируется к реактивной библиотеке, выбранной приложением. Это делается при помощи ReactiveAdapterRegistry
, который обеспечивает подключаемые средства поддержки реактивной библиотеки и других асинхронных типов. В реестр встроена поддержка RxJava 3, сопрограмм Kotlin и SmallRye Mutiny, но вы можете зарегистрировать и другие сторонние адаптеры.
Начиная с версии Spring Framework 5.3.11, поддержка RxJava 1 и 2 прекращена в соответствии с рекомендациями RxJava об окончании срока жизненного цикла и рекомендациями по обновлению до RxJava 3.
Для функциональных API (таких как функциональные конечные точки, WebClient
и другие) применяются общие для API WebFlux правила – Flux
и Mono
используются в качестве возвращаемых значений, а Publisher
из спецификации Reactive Streams – в качестве вводных данных. Когда предоставляется Publisher
, будь то кастомный или из другой реактивной библиотеки, он может приниматься только за поток с неизвестной семантикой (0..N). Если, однако, семантика известна, можно обернуть его с помощью Flux
или Mono.from(Publisher)
вместо того, чтобы передавать сырой Publisher
.
Например, при наличии Publisher
, который не является Mono
, программа записи сообщений библиотеки Jackson в формате JSON принимает несколько значений. Если тип медиа подразумевает бесконечный поток (например, application/json+stream
), значения записываются и сбрасываются по отдельности. В противном случае значения буферизируются в список и выводятся в виде массива в формате JSON.