Ответ
DispatcherServlet определяет тип контроллера через механизм HandlerAdapter. После того как HandlerMapping находит подходящий обработчик (контроллер), сервлет ищет HandlerAdapter, который может с этим обработчиком работать.
Процесс:
- Сопоставление:
RequestMappingHandlerMappingнаходит метод контроллера по URL и HTTP-методу (используя аннотации@RequestMapping,@GetMappingи др.). - Адаптация:
DispatcherServletперебирает зарегистрированныеHandlerAdapter-ы, вызываяsupports(Object handler). Адаптер определяет тип контроллера по его аннотациям и сигнатуре.
Основные типы контроллеров и их адаптеры:
@Controller/@RestController: ОбрабатываетсяRequestMappingHandlerAdapter. Возвращаемое значение интерпретируется как имя представления (для@Controller) или напрямую сериализуется в тело ответа (для@RestController).- Контроллеры, реализующие интерфейс
Controller: ОбрабатываютсяSimpleControllerHandlerAdapter(устаревший подход). HttpRequestHandler: ОбрабатываетсяHttpRequestHandlerAdapter(например, для обработки статических ресурсов).
Пример:
@RestController // Тип контроллера определяется по этой аннотации
public class ApiController {
@GetMapping("/data")
public ResponseEntity<String> getData() {
return ResponseEntity.ok("Response");
}
}
RequestMappingHandlerAdapter распознает этот класс как контроллер на основе аннотации @RestController и обработает его метод.