Аннотация @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 @ResponseBody public class MVCController { .. your logic } |
1
2
3
4
|
@RestController public 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
@ResponseBody
public
@interface
RestController
и вот как выглядит объявление
@Controller
:12345@Target
(value=TYPE)
@Retention
(value=RUNTIME)
@Documented
@Component
public
@interface
Controller
- Одно из ключевых отличий между
@Controler
и@RestCotroller
в Spring MVC заключается в том, что если вы пометите класс как@RestController
то каждый метод будет записан как объект домена вместо представления. Вы можете увидеть введение Брайана Хассена в Spring MVC 4, чтобы узнать больше об использовании аннотации@RestController
в приложении на основе Spring. - Другое ключевое отличие между
@RestController
и@Controller
заключается в том, что вам не нужно использовать@ResponseBody
для каждого метода-обработчика, когда вы аннотируете класс с помощью@RestController
как показано ниже:с @RestControler:
123456789@RestController
public
class
Book{
@RequestMapping
(value={
"/book"
})
public
Book getBook(){
//...
return
book;
}
}
без @RestController:
01020304050607080910@Controller
public
class
Book{
@RequestMapping
(value={
"/book"
})
@ResponseBody
public
Book getBook(){
//...
return
book;
}
}
Вы можете видеть, что если вы используете аннотацию 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 . |