Чтобы добавить ответ @ GaryF и прояснить некоторые моменты, Spring 2.5 представил аннотированные контроллеры, которые заменили старые контроллеры в стиле интерфейса Spring 2.0. Эти новые контроллеры имеют методы без фиксированных параметров - метод объявляет параметры, необходимые для его работы, и ничего более.
Например, скажем, для метода контроллера требуется одна вещь, чтобы выполнить свою работу - параметр запроса, который содержит идентификатор объекта из базы данных. В Spring 2.0 вам нужно реализовать что-то вроде AbstractController.handleRequestInternal()
, например,
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
MyThing obj = getObjById(id);
//... do stuff and return ModelAndView
}
Пружина 2.5 сделала это проще:
@RequestMapping
public ModelAndView handle(String id) {
MyThing obj = getObjById(id);
//... do stuff and return ModelAndView
}
Здесь мы объявляем параметры только для того, что нам нужно.
Пока все хорошо, но тут появляется пользовательский WebArgumentResolver
. Скажем, я хочу полностью удалить getObjById
из моего контроллера, потому что, возможно, я думаю, что он загромождает код, и, возможно, он используется во многих другие методы контроллера. Вместо этого я хочу сделать это:
@RequestMapping
public ModelAndView handle(MyThing id) {
//... do stuff and return ModelAndView
}
Это еще проще и имеет минимальный шаблонный код. Пользовательский WebArgumentResolver
может быть зарегистрирован в контексте приложения, который распознает параметры типа MyThing
и знает, как извлечь информацию из запроса. Spring вызывает этот распознаватель и передает результат в метод контроллера.
Пользовательские распознаватели обычно не используются, но могут быть очень полезны в правильной ситуации.
В примере в вашем вопросе используется CustomArgumentResolver
для разрешения пользовательского класса RequestAttribute
. Средство распознавания извлекает атрибуты запроса и связывает их с RequestAttribute
объектами, так что они могут быть объявлены как параметры метода контроллера.