@ExceptionHandler, @InitBinder va @ModelAttribute bilan aniqlangan metodlar faqat @Controller annotatsiyasi bilan belgilangan sinf yoki ular e'lon qilingan sinflar iyerarxiyasiga qo'llaniladi. Agar ular o'rniga @ControllerAdvice yoki @RestControllerAdvice annotatsiya qilingan sinfda e'lon qilingan bo'lsa, ular har qanday controllerga qo'llanadi. Bundan tashqari, 5.3 versiyasidan boshlab @ControllerAdvice da @ExceptionHandler bilan aniqlangan metodlar, har qanday controller handler yoki boshqa har qanday handlerda istisnolarni qayta ishlashda foydalanilishi mumkin.
@ControllerAdvice annotatsiyasi @Component annotatsiyasi bilan meta-annotatsiyalangan va shuning uchun component scanning orqali Spring bean sifatida ro'yxatdan o'tkazilishi mumkin. @RestControllerAdvice annotatsiyasi esa @ControllerAdvice va @ResponseBody annotatsiyalari bilan meta-annotatsiyalangan, va bu @ExceptionHandler annotatsiya qilingan metodlar, qaytuv qiymatlarini HTML ko'rinishida emas, balki javob tanasi xabari konversiyasi orqali renderlanadi, deganidir.
Bo'lganda RequestMappingHandlerMapping va ExceptionHandlerExceptionResolver controllerga Advice beanlarini topib va ularni ishlatish vaqtida qo'llashadi. @ControllerAdvice dan global @ExceptionHandler annotatsiyasi bilan belgilangan metodlar, @Controller dan lokal metodlardan so'ng qo'llaniladi. Aksincha, @ModelAttribute va @InitBinder bilan global metodlar, lokal metodlardan oldin qo'llaniladi.
@ControllerAdvice annotatsiyasi, ularni qaysi controllerlar va handlerlarga qo'llashni cheklash imkonini beruvchi atributlarga ega. Misol uchun:
// @RestController yordamida annotatsiya qilingan barcha controllerlarni maqsad qilamiz
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}
// Ma'lum packagelardagi barcha controllerlarni maqsad qilamiz
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}
// Ma'lum sinflarga tayinlangan barcha controllerlarni maqsad qilamiz
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
// @RestController yordamida annotatsiya qilingan barcha controllerlarni maqsad qilamiz
@ControllerAdvice(annotations = [RestController::class])
class ExampleAdvice1
// Ma'lum packagelardagi barcha controllerlarni maqsad qilamiz
@ControllerAdvice("org.example.controllers")
class ExampleAdvice2
// Ma'lum sinflarga tayinlangan barcha controllerlarni maqsad qilamiz
@ControllerAdvice(assignableTypes = [ControllerInterface::class, AbstractController::class])
class ExampleAdvice3
Yuqoridagi misoldagi selektorlar ish vaqtida hisoblanadi va keng qo'llanilganda samaradorlikka salbiy ta'sir ko'rsatishi mumkin. Batafsil ma'lumot uchun @ControllerAdvice annotatsiyasi haqida javadocga qarang.
GO TO FULL VERSION