Методи, анотовані @ExceptionHandler, @InitBinder та @ModelAttribute застосовуються тільки до класу, позначеного анотацією @Controller, або до ієрархії класів, у яких оголошено. Якщо замість цього вони оголошені в класі, анотованому @ControllerAdvice або @RestControllerAdvice, вони застосовуються до будь-якого контролера. Ба більше, починаючи з версії 5.3, методи, анотовані @ExceptionHandler у @ControllerAdvice можна використовувати для обробки винятків з будь-якого позначеного анотацією @Controller обробника або будь-якого іншого обробника.

Анотація @ControllerAdvice мета-анотована за допомогою анотації @Component і тому може бути зареєстрована як бін Spring через сканування компонентів. Анотація @RestControllerAdvice мета-анотована за допомогою анотації @ControllerAdvice та анотації @ResponseBody, і це означає, що методи, позначені анотацією @ ExceptionHandler, будуть мати своє значення, що повертається, візуалізується через перетворення повідомлення тіла відповіді, а не через HTML-подання.

Під час запуску RequestMappingHandlerMapping та ExceptionHandlerExceptionResolver виявляють забезпечені Advice біни контролера і застосовують їх під час виконання. Глобальні методи, позначені анотацією @ExceptionHandler з @ControllerAdvice, застосовуються після локальних, з @Controller. І навпаки, глобальні методи з анотаціями @ModelAttribute та @InitBinder застосовуються перед локальними.

Анотація @ControllerAdvice має атрибути, які дозволяють звузити набір контролерів та обробників, до яких вони застосовуються. Наприклад:

Java
// Робимо за мету всі контролери, анотовані за допомогою @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}
// Маємо на меті всі контролери в певних пакетах
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}
// Робимо за мету всі контролери, які призначаються певним класам
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
Kotlin
// Робимо за мету всі контролери, анотовані за допомогою @RestController
@ControllerAdvice(annotations = [RestController::class])
class ExampleAdvice1
// Маємо на меті всі контролери в певних пакетах
@ControllerAdvice("org.example.controllers")
class ExampleAdvice2
// Робимо за мету всі контролери, які призначаються певним класам
@ControllerAdvice(assignableTypes = [ControllerInterface::class, AbstractController::class])
class ExampleAdvice3

Селектори в попередньому прикладі обчислюються під час виконання та можуть негативно вплинути на продуктивність при широкому використанні. Детальнішу інформацію дивися в javadoc по анотації @ControllerAdvice.