Аннотация @RestController в Spring MVC — это не что иное, как сочетание аннотации @Controller и @ResponseBody . Он был добавлен в Spring 4.0 для упрощения разработки веб-служб RESTful в среде Spring. Если вы знакомы с веб-службами REST, вы знаете, что принципиальное различие между веб-приложением и API-интерфейсом REST заключается в том, что ответ веб-приложения представляет собой общий вид HTML + CSS + JavaScript, тогда как API-интерфейс REST просто возвращает данные в форме JSON или XML. Эта разница также очевидна в аннотации @Controller и @RestController . Задача @Controller — создать карту объекта модели и найти представление, но @RestController просто возвращает объект, и данные объекта напрямую записываются в HTTP-ответ в виде JSON или XML.
Это также можно сделать с помощью традиционного @Controller и использования аннотации @ResponseBody но так как это стандартное поведение веб-сервисов RESTful, Spring представил @RestController который сочетал в себе поведение @Controller и @ResponseBody .
Вкратце, следующие два фрагмента кода в Spring MVC равны:
|
1
2
3
4
5
|
@Controller@ResponseBodypublic class MVCController { .. your logic} |
|
1
2
3
4
|
@RestControllerpublic class RestFulController { .... your logic} |
Очевидно, что все хотели бы объявить только одну аннотацию вместо двух. Кроме того, @RestController более очевиден, чем предыдущие два.
Что такое @Controller и @RestController в Spring?
В среде Spring Controller — это класс, который отвечает за подготовку карты модели с данными, отображаемыми представлением, а также за выбор правильного представления. Он также может напрямую записывать в поток ответов с помощью аннотации @ResponseBody и завершать запрос.
Поведение записи непосредственно в поток ответов очень полезно для ответа на вызовы веб-сервисов RESTful, потому что там мы просто возвращаем данные вместо того, чтобы возвращать представление, как объяснялось в моем предыдущем посте о внутренней работе Spring MVC .
Если вы разрабатывали веб-сервисы RESTful до Spring 4, например, в Spring 3 или Spring 3.1, вы были бы знакомы с использованием комбинации @Controller и @ResponseBody для создания ответа RESTful. Ребята из Spring @RestController эту @RestController и создали @RestController .
Теперь вам не нужно использовать аннотацию @Controller и @RestponseBody . Вместо этого вы можете использовать @RestController для обеспечения той же функциональности. Короче говоря, это удобный контроллер, который объединяет в себе поведение @Controler и тела @Response .
Вы также можете присоединиться к REST Eugen Paraschiv с классом Spring Master, если вам больше интересно изучать передовые методы разработки веб-службы RESTFul в Spring.
Разница между @RestController и @Controller в Spring
Теперь, когда вы знакомы с обеими этими аннотациями, самое время проанализировать некоторые фактические различия между @RestController и @Controler . Это очень важная концепция, причем не только с точки зрения интервью, но и с точки зрения сертификации разработчиков Spring Core и Spring Web Application. Если вы готовитесь к весенней сертификации , вы должны быть знакомы с такими тонкими различиями. Кроме того, вы также можете ознакомиться с бесплатными тестами Spring, чтобы получить представление о формате экзамена и уровне вопросов.
В любом случае, давайте вернемся к сути, вот некоторые важные различия между этими двумя аннотациями.
-
@Controller— это обычная аннотация, которая используется для пометки класса как Spring MVC Controller, тогда как@RestController— это специальный контроллер, используемый в веб-сервисах RESTFul, и эквивалент@Controller + @ResponseBody. -
@RestControllerявляется относительно новым, добавлен только в Spring 4.0, но@Controllerявляется старой аннотацией, существует с тех пор, как Spring начал поддерживать аннотацию, и официально он был добавлен в версии Spring 2.5. - Аннотация
@Controllerуказывает, что класс является «Контроллером», например, веб-контроллером, в то время@RestControllerпримечание@RestControllerуказывает, что класс является контроллером, где методы@ResponseBodyпо умолчанию принимают семантику@ResponseBody, то есть обслуживают REST API. -
@Controller— это специализация аннотации@RestControllerа@RestController— это специализация аннотации@Controller. На самом деле это удобный контроллер, аннотированный@Controllerи@ResponseBodyкак показано ниже.123456@Target(value=TYPE)@Retention(value=RUNTIME)@Documented@Controller@ResponseBodypublic@interfaceRestControllerи вот как выглядит объявление
@Controller:12345@Target(value=TYPE)@Retention(value=RUNTIME)@Documented@Componentpublic@interfaceController - Одно из ключевых отличий между
@Controlerи@RestCotrollerв Spring MVC заключается в том, что если вы пометите класс как@RestControllerто каждый метод будет записан как объект домена вместо представления. Вы можете увидеть введение Брайана Хассена в Spring MVC 4, чтобы узнать больше об использовании аннотации@RestControllerв приложении на основе Spring. - Другое ключевое отличие между
@RestControllerи@Controllerзаключается в том, что вам не нужно использовать@ResponseBodyдля каждого метода-обработчика, когда вы аннотируете класс с помощью@RestControllerкак показано ниже:с @RestControler:
123456789@RestControllerpublicclassBook{@RequestMapping(value={"/book"})publicBook getBook(){//...returnbook;}}без @RestController:
01020304050607080910@ControllerpublicclassBook{@RequestMapping(value={"/book"})@ResponseBodypublicBook getBook(){//...returnbook;}}
Вы можете видеть, что если вы используете аннотацию Spring MVC @Controller для создания ответа RESTful, вам нужно аннотировать каждый метод аннотацией @ResponseBody , которая не требуется при использовании @RestController . Это не только делает ваш код более читабельным, но и экономит для вас пару нажатий клавиш.
Вот простой пример HelloWorld с использованием @RestController и @RestController SpringBoot :
Вот и все о разнице между аннотациями @Controller и @RestController в Spring MVC и REST. @RestController — это всего лишь ярлык для совместного использования аннотаций @Controller и @ResponseBody .
Spring специально добавил эту аннотацию в Spring 4, чтобы упростить разработку веб-сервисов RESTful с помощью Spring Framework. Он может напрямую преобразовывать ответ в JSON или XML в зависимости от типа запроса MIME.
Итак, если вы создаете веб-службы RESTful, лучше использовать @RestController чем объединять @Controller с @ResponseBody .
Если вы хотите больше узнать о разработке веб-сервисов RESTful с использованием среды Spring и Spring Security, я предлагаю вам присоединиться к REST Eugen Paraschiv с классом Spring Coaching . У Евгения есть хороший реальный опыт разработки и защиты веб-сервисов RESTful на Java, и этот класс — хорошая возможность извлечь выгоду из его огромного опыта.
| Ссылка: | Отличие между @RestController и @Controller Annotation в Spring MVC и REST от нашего партнера по JCG Явина Пола в блоге Javarevisited . |
