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.