Spring MVC和REST中@RestController和@Controller注释之间的区别

Spring MVC中的@RestController注释不过是@Controller@ResponseBody注释的组合。 它已添加到Spring 4.0中,以简化在Spring框架中RESTful Web Services的开发。 如果您熟悉REST Web服务,您就会知道Web应用程序与REST API之间的根本区别在于,Web应用程序的响应通常是HTML + CSS + JavaScript的视图,而REST API只是以以下形式返回数据: JSON或XML。 这种差异在@Controller@RestController批注中也很明显。 @Controller的工作是创建模型对象的Map并找到一个视图,但是@RestController只是返回对象,而对象数据@RestController JSON或XML的形式直接写入HTTP响应中。

这也可以通过传统的@Controller以及@ResponseBody批注来完成,但是由于这是RESTful Web服务的默认行为,因此Spring引入了@RestController ,它将@Controller@ResponseBody的行为结合在一起。

简而言之,Spring MVC中的以下两个代码段相同:

@Controller
@ResponseBody
public class MVCController { 
   .. your logic
}
@RestController
public class RestFulController { 
  .... your logic
}

显然,每个人都只想声明一个注解,而不是两个。 另外, @RestController比前两个更明显。

Spring中的@Controller和@RestController是什么?

在Spring框架中, Controller是一个类,它负责准备模型Map,其中包含要由视图显示的数据以及选择正确的视图本身。 它也可以使用@ResponseBody批注直接写入响应流并完成请求。

直接写入响应流的行为对于响应对RESTful Web服务的调用非常有用,因为在这里,我们只是返回数据,而不是返回我早先有关Spring MVC内部工作方式的解释中所述的视图。

如果您在Spring 4之前(例如在Spring 3或Spring 3.1中)开发了RESTful Web服务,那么通过使用@Controller@ResponseBody的组合来创建RESTful响应,您将会很熟悉。 Spring人意识到了这个问题,并创建了@RestController

现在,您无需使用@Controller@RestponseBody批注。 相反,您可以使用@RestController提供相同的功能。 简而言之,它是一种便捷控制器,它将@Controler@Response主体的行为组合为一个。

如果您更想了解在Spring中开发RESTFul Web Service的高级技术,可以进一步将Eugen Paraschiv的REST与Spring Master类一起加入。

Spring中@RestController和@Controller之间的区别

现在,您已经熟悉了这两个注释,现在是分析@RestController@Controler之间的某些事实差异的好时机。 这是一个非常重要的概念,不仅从访谈的角度来看,而且从Spring Core和Spring Web应用程序开发人员认证中也是如此。 如果您正在准备Spring认证 ,则应该熟悉这些细微的差异。 此外,您还可以查看免费的Spring考试,以了解有关考试格式和问题级别的信息。

无论如何,让我们回到重点,这是这两个注释之间的一些重要区别。

  1. @Controller是一个通用注释,用于将类标记为Spring MVC Controller,而@RestControllerRESTFul Web服务中使用的特殊控制器,等效于@Controller + @ResponseBody
  2. @RestController是相对较新的,仅在Spring 4.0上添加,但是@Controller是一个旧的注释,自Spring开始支持注释以来就存在,并正式在Spring 2.5版本中添加。
  3. @Controller批注指示该类是“控制器”,例如Web控制器,而@RestController批注指示该类是一个控制器,其中@RequestMapping方法默认情况下采用@ResponseBody语义,即为REST API服务。
  4. @Controller@Component注释的特化,而@RestController@Controller注释的特化。 它实际上是一个使用@Controller@ResponseBody注释的便捷控制器,如下所示。
    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Controller 
    @ResponseBody
    public @interface RestController

    这是@Controller声明的样子:

    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Component
    public @interface Controller
  5. Spring MVC中@Controler@RestCotroller之间的主要区别之一是,一旦将一个类标记为@RestController则每个方法都将写入域对象而不是视图。 您可以参阅Bryan Hassen的Spring MVC 4简介,以了解有关如何在基于Spring的应用程序中使用@RestController批注的更多信息。
  6. @RestController@Controller之间的另一个关键区别是,一旦使用@ResponseBody注释了该类, @RestController @ResponseBody在每个处理程序方法上都使用@RestController ,如下所示:

    使用@RestControler:

    @RestController
    public class Book{
    
    @RequestMapping(value={"/book"})
    public Book getBook(){
    //...
    return book;
    }
    }

    没有@RestController:

    @Controller
    public class Book{
    
    @RequestMapping(value={"/book"})
    @ResponseBody
    public Book getBook(){
    //...
    return book;
    }
    }

您可以看到,如果使用Spring MVC @Controller批注创建RESTful响应 ,则需要使用@ResponseBody批注对每个方法进行批注,而在使用@RestController时则不需要。 它不仅使您的代码更具可读性,而且还为您节省了几个按键。

这是一个使用@RestControllerSpringBoot框架的简单HelloWorld示例:

这就是Spring MVC和REST中@Controller@RestController批注之间区别@RestController是同时使用@Controller@ResponseBody批注的快捷方式。

Spring在Spring 4中有目的地添加了此批注,以使使用Spring框架的RESTful Web服务开发更加容易。 它可以根据请求的MIME类型将响应直接转换为JSON或XML。

因此,如果要创建RESTful Web服务,最好使用@RestController不是将@Controller组合到@ResponseBody

如果您想了解有关使用Spring和Spring Security框架开发RESTful Web服务的更多信息,建议您将Eugen Paraschiv的REST与Spring Coaching一起加入。 Eugen在Java中开发和保护RESTful Web服务方面具有一些良好的现实世界经验,该课程是从他的丰富经验中受益的好机会。

翻译自: https://www.javacodegeeks.com/2017/08/difference-restcontroller-controller-annotation-spring-mvc-rest.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值