Spring WebFlux, Spring MVC kabi, kirish nuqtasi (front controller) shabloniga asoslangan bo'lib, markaziy WebHandler, DispatcherHandler, so'rovlarni qayta ishlashning umumiy algoritmini ta'minlaydi va amaliy ishni sozlanishi komponent-delegatlar bajaradi. Ushbu model moslashuvchan va turli ish jarayonlarini qo'llab-quvvatlaydi.
DispatcherHandler Spring konfiguratsiyasidan o'ziga kerakli komponent-delegatlarni topadi. U shuningdek, Spring bean sifatida ishlash uchun ishlab chiqilgan va ishga tushadigan kontekstga kirish uchun ApplicationContextAware ni amalga oshiradi. Agar DispatcherHandler webHandler bean nomi bilan e'lon qilingan bo'lsa, u WebHttpHandlerBuilder tomonidan topiladi, bu so'rovlarni qayta ishlash zanjirini yig'adi.
WebFlux ilovasidagi Spring konfiguratsiyasi odatda quyidagilarni o'z ichiga oladi:
-
DispatcherHandlernomliwebHandler;bean; -
WebFilter binivaWebExceptionHandler; -
Maxsus
DispatcherHandlerbinlari; -
Va hokazo.
Konfiguratsiya WebHttpHandlerBuilder'ga so'rovlarni qayta ishlash zanjirini tuzish uchun uzatiladi, quyidagi misolda ko'rsatilganidek:
ApplicationContext context = ...
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();
val context: ApplicationContext = ...
val handler = WebHttpHandlerBuilder.applicationContext(context).build()
Yaratilgan HttpHandler server adapteri bilan ishlatishga tayyor.
1.3.1. Maxsus bin turlari
DispatcherHandler so'rovlarni qayta ishlash va mos javoblarni berish uchun maxsus binlarga topshiradi. "Maxsus binlar" dedimizda, WebFlux framework kontraktlarini amalga oshiruvchi Spring tomonidan boshqariladigan Object instantsiyalarni nazarda tutmoqdamiz. Odatda, ularning ichki kontraktlari mavjud, lekin siz ularning xususiyatlarini sozlashingiz, kengaytirishingiz yoki almashtirishingiz mumkin.
Quyidagi jadvalda DispatcherHandler tomonidan aniqlangan maxsus binlar sanab o'tilgan. Shuni unutmangki, pastroq darajalarda belgilangan boshqa bin turlari ham mavjud.
| Bin turi | Izoh |
|---|---|
|
|
Talabni handlerga moslashtiradi. Moslashtirish ba'zi mezonlarga asoslangan bo'lib,
|
|
|
|
|
|
Handler chaqirish natijasini qayta ishlaydi va javobni tugatadi. |
WebFlux Konfiguratsiyasi
Ilovalar talablarni qayta ishlash uchun zarur bo'lgan infratuzilma binlarini e'lon qilishi mumkin. Ammo ko'p hollarda, WebFlux konfiguratsiyasi eng yaxshi boshlang'ich nuctasi hisoblanadi. U zarur binlarni e'lon qiladi va yuqori darajadagi konfiguratsiya qayta chaqiruv API'sini taqdim etadi.
1.3.3. Qayta ishlash
DispatcherHandler so'rovlarni quyidagi tarzda qayta ishlaydi:
-
Har bir
HandlerMappingdan mos handlerni topish uchun foydalaniladi va birinchi moslama ishlatiladi. -
Agar handler topilsa, u tegishli
HandlerAdapterorqali ishlaydi, bu qayta ishlash natijasiniHandlerResultsifatida qaytaradi. -
HandlerResulttegishliHandlerResultHandlerga javobni bevosita yoki ko'rinish orqali ko'rsatish orqali tugatish uchun yuboriladi.
1.3.4. Natijalarni qayta ishlash
Handler tomonidan chaqirilgandan keyin qaytariladigan qiymat HandlerAdapter orqali HandlerResult sifatida o'raladi, yana qo'shimcha kontekst bilan birgalikda, birinchi HandlerResultHandlerga qo'llaniladi, bu esa uning qo'llab-quvvatlashini tasdiqlaydi. Quyidagi jadvalda mavjud HandlerResultHandler amalga oshirilishlari ko'rsatilgan, barchasi WebFlux konfiguratsiyasida e'lon qilingan:
| Natija qayta ishlovchi turi | Qaytariladigan qiymatlar | Standart tartib |
|---|---|---|
|
|
|
0 |
|
|
|
0 |
|
|
|
100 |
|
|
|
|
Istisnolar
HandlerResult, HandlerAdapter orqali qaytarilgan holda, xato asosidagi xatolarni qayta ishlash funktsiyasini ochishi mumkin. Bu xato funktsiyasi quyidagi hollarda chaqiriladi:
-
Handler chaqiruvi (masalan,
@Controllerannotatsiyasi) xato bilan tugaydi. -
Handlerning qaytarilgan qiymatini
HandlerResultHandlerorqali qayta ishlash xato bilan yakunlanadi.
Xato funktsiyasi javobni o'zgartirishi (masalan, xato statusiga), agar xato signali handler tomonidan qaytariladigan reaktiv turdan oldin kelib chiqsa.
Bu @Controller annotatsiyali klasslarda @ExceptionHandler bilan annotatsiyalangan metodlarni qo'llab-quvvatlaydi. Aksincha, ularning Spring MVC'dagi qo'llab-quvvatlovi HandlerExceptionResolverga asoslanadi. Odatda bu muhim emas. Ammo WebFluxda exceptionlarni amalga oshirilmagan handler tanlashdan oldin qayta ishlash uchun annotation'ga @ControllerAdviceni ishlatib bo'lmaydi.
Shuningdek, "Anotatsiyalangan controller" bo'limidagi "Istisnolarni boshqarish" ost bo'limiga yoki WebHandler API'siga bag'ishlangan bo'limdagi "Istisnolar" ga qarang.
Ko'rinishni aniqlash
Ko'rinishni aniqlash sizga HTML-shablon va model yordamida brauzerni ko'rsatishga imkon beradi, sizni aniq bir ko'rinish texnologiyasiga bog'lamaydi. Spring WebFluxda ko'rinishni aniqlash ViewResolver exekuzvalaridan foydalanadigan maxsus HandlerResultHandler tomonidan qo'llab-quvvatlanadi, bu esa satr (mantiqiy ko'rinish nomini ifodalaydigan)ni View ga o'tkazadi. Keyin View javobni ko'rsatish uchun ishlatiladi.
Qayta ishlash
ViewResolutionResultHandler ga uzatilgan HandlerResult, handler tomonidan qaytarilgan qiymat va so'rovni qayta ishlash jarayonida qo'shilgan atributlarni o'z ichiga olgan modelni o'z ichiga oladi. Qaytarilgan qiymat quyidagi holatlardan biri sifatida qayta ishlanadi:
-
String,CharSequence:Viewga ruxsat berilishi kerak bo'lganViewni borViewResolverning sozlangan ro'yxati orqali mantiqiy nomini ifodalaydi. -
void: So'rov yo'lidan asoslangan holda standart ko'rinish nomi tanlanadi, boshlang'ich va oxirgi slashni olib. -
Rendering: Ko'rinishni aniqlash skriptlari uchun API. IDE'nizdagi kodni avtomatik to'ldirish imkoniyatlarini o'rganing.
-
Model,Map: So'rov uchun modellar qoshilganda qo'shimcha atributlarni o'z ichiga oladi. -
Har qanday boshqa: Har qanday boshqa qaytarilgan qiymat model attributi sifatida qo'shiladi, oddiy turlar belgilanmasa BeanUtils#isSimpleProperty orqali, agar
@ModelAttributehandler metodi annotatsiyasi bo'lmasa.
Model asinxron, reaktiv turlarni (masalan, Reactor yoki RxJava) o'z ichiga olishi mumkin. Shablonlar AbstractView orqali bunday model atributlarini aniq qiymatlarga o'zgartiradi va modelni yangilaydi. Mono qiymatlar bir qiymatga yoki hech narsa emas (agar bo'sh) bilan aniqlanadi, va ko'plab qiymatli turlar (masalan, Flux<T>) yig'ilib List<T> ga aniqlanadi.
Ko'rinishni aniqlashni sozlash shunchaki Spring konfiguratsiyasiga ViewResolutionResultHandler binini qo'shishdan iborat. WebFlux konfiguratsiyasi ko'rinish sohasini aniqlash uchun maxsus API konfiguratsiyani ta'minlaydi.
Qayta yo'naltirish
Ko'rinish nomidagi redirect: maxsus prefiksni ishlatish qayta yo'naltirishni amalga oshiradi. UrlBasedViewResolver (va subklasslar) bu yo'nalishni ko'rsatadi. Ko'rinish nomining qolgan qismi qayta yo'naltirish URL manzili.
Natijada oddiygina, kontroller RedirectView yoki Rendering.redirectTo("abc").build() ni qaytarish uchun ko'rinish nomlari bilan ishlay oladi. Ko'rinish nomi, masalan redirect:/some/resource, hozirgi ilovaga nisbatan bo'lsa, redirect:https://example.com/arbitrary/path kabi ko'rinish nomi esa absolyut URL manziliga qayta yo'naltiradi.
Kontent bilan kelishuvchi
ViewResolutionResultHandler kontent bilan kelishuvni qo'llab-quvvatlaydi. Ushbu qayta ishlovchi so'rovning media tiplarini har bir tanlangan View tomonidan qo'llab-quvvatlanadigan media tiplari bilan solishtiradi. Birinchi View, qo'llab-quvvatlanadigan so'rov media tipi bo'lsa, ishlatiladi.
JSON va XML kabi media turlarini qo'llab-quvvatlash uchun Spring WebFlux HttpMessageWriterView taqdim etadi, bu maxsus View bo'lib, HttpMessageWriter orqali ko'rinishni amalga oshiradi. Odatda, bu ko'rinishlar WebFlux konfiguratsiyasi orqali standart ko'rinishlar sifatida sozlanadi. Standart ko'rinishlar har doim tanlanadi va so'ralgan media tipiga mos kelsa ishlatiladi.
GO TO FULL VERSION