То, как аннотация уровня класса применяется ко всем методам, не относится к аннотации @ResponseBody
, она применима ко всем таким аннотациям, например, @Transactional
. При компиляции кода с аннотациями компилятор запускает соответствующий процессор аннотаций (который проявил интерес к этой конкретной аннотации). Процессор аннотаций обычно использует отражение для проверки компилируемых элементов. Процессор может просто выполнить проверки фрагментов кода / методов, изменить их или сгенерировать новый код перед окончательной компиляцией. И это может включать модификацию всех методов этого класса. См. http://mkyong.com/java/java-custom-annotations-example для примера реализации пользовательских аннотаций на уровне класса.
Идет в @ResponseBody:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html утверждает, что начиная с весенней версии 4.0 @ResponseBody
аннотация также может быть добавлена на уровне типа, и в этом случае она наследуется и не требует добавления на уровне метода.
Как работает @ResponseBody:
Если вы аннотируете метод (или инкапсулирующий класс) с помощью @ResponseBody
, Spring попытается преобразовать возвращаемое значение метода и автоматически записать его в ответ http.
В зависимости от вашей конфигурации у Spring есть список HttpMessageConverters, зарегистрированных в фоновом режиме. Обязанность HttpMessageConverter - преобразовать возвращаемое значение метода в тело ответа HTTP, в зависимости от предварительно определенного типа MIME.
Каждый раз, когда выданный запрос достигает аннотации @ResponseBody
, пружина перебирает все зарегистрированные HttpMessageConverters, ища первое, которое соответствует данному типу и классу пантомимы, а затем использует его для фактического преобразования.