为了账号安全,请及时绑定邮箱和手机立即绑定

@RestController 和 @Component 之间的细微差别

@RestController 和 @Component 之间的细微差别

眼眸繁星 2023-10-19 21:43:33
虽然网上每个页面都说@RestController是@Component的规范,但我不知道它是否与DispatcherServlet有关。但是当我通过在 @RestController 和 @Component 之间切换来尝试下面的代码时,我没有看到相同的行为:首先我尝试使用@RestController:@RestComponentpublic class TestController {    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)    public void testController() {        System.out.println("Hello");    }}我在控制台中得到以下输出:你好其次我尝试使用@Component + @ResponseBody:@Component@ResponseBodypublic class TestController {    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)    public void testController() {        System.out.println("Hello");    }}我在邮递员上收到错误:{    "timestamp": 1570998345860,    "status": 405,    "error": "Method Not Allowed",    "message": "Request method 'POST' not supported",    "path": "/testController"}如果两个注释相同,那么为什么输出存在差异?下面是 @RestController 和 @Controller 的源代码,可以看出 @RestController 和 @Controller 都是 @Component 的规范:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Controller@ResponseBodypublic @interface RestController {}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller {}也许它必须与DispatcherServlet有关。Dispatcher Servlet 可能只检查 @RestController 注解的类中的 URL。
查看完整描述

4 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

@Controller是传统控制器中的用户,引入@RestController注解是为了简化RESTful Web服务的创建。这是一个结合了 @Controller 和 @ResponseBody 的便捷注解

@Controller 注释只是 @Component 类的特化,允许通过类路径扫描自动检测实现类。

@Controller 通常与请求处理方法上使用的 @RequestMapping 注释结合使用。

请求处理方法用@ResponseBody注释。此注释允许将返回对象自动序列化到 HttpResponse 中。

@RestController 是控制器的特殊版本。它包含 @Controller 和 @ResponseBody 注释,因此简化了控制器实现。

控制器使用 @RestController 注释进行注释,因此不需要 @ResponseBody。

控制器类的每个请求处理方法都会自动将返回对象序列化为 HttpResponse。

查看完整回答
反对 回复 2023-10-19
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

仅仅因为@RestController它是一个@Component并不意味着您可以通过切换到更广泛的功能来实现相同的功能@Component。即使添加了@ResponseBody,您也无法实现等效的功能(如通过POST不支持的请求方法所表示的)。

替换@Component@Controller,因为 a与+@RestController具有完全相同的功能。您还可以在 的元注释中看到这一点,您会看到它是元注释的,而不仅仅是。反过来,用 进行元注释。@Controller@ResponseBody@RestController@Controller@Component@Controller@Component


查看完整回答
反对 回复 2023-10-19
?
函数式编程

TA贡献1807条经验 获得超9个赞

都是用注解进行元注解的@Controller注解。所有这些注释本质上都是针对特定用例的注释的专业化。该注解一般用于注册Spring bean。@RestController@Service@Component@Component@Component

@Controller注解即使是用@Componentinside 进行注解的,它也提供了完全不同的功能。通过使用此注解来注解一个类,我们实际上是在告诉 spring 扫描此类中的@RequestMapping注解来注册 bean 以进行请求映射。当您仅使用注释时,不会发生这种情况@Component

当 spring 应用程序启动时,DispatcherServlet将启用(这是一个在s 上RequestMappingHandlerMapping RequestMappingHandlerAdapter查找注释的处理程序映射)。因此,当请求到达调度程序 servlet 时,它会将其交给将uri 解析为控制器方法 bean。5.x@RequestMapping@ControllerRequestMappingHandlerMappingDispatcherServlet HandlerMapping

注意:在旧版本的 spring 中,DefaultAnnotationHandlerMapping spring 启用了此功能。

综上所述:

  • @Component是任何 Spring 管理的组件或 bean 的通用构造型。

  • @Repository是持久层的构造型。

  • @Service是服务层的构造型。

  • @Controller是表示层(spring-MVC)的构造型。

@Controller注释指示特定类充当控制器的角色。

注解的基本目的@Controller是充当被注解类的构造型,表明其作用。调度程序将扫描此类带注释的类以查找映射方法,检测@RequestMapping注释(请参阅下一节)。

带注释的控制器 bean 可以使用调度程序上下文中的标准 Spring bean 定义来显式定义。然而, @Controller构造型还允许自动检测,与 Spring 2.5 对检测类路径中的组件类和自动注册它们的 bean 定义的一般支持保持一致。


查看完整回答
反对 回复 2023-10-19
?
茅侃侃

TA贡献1842条经验 获得超21个赞

您不应该得到相同的行为,因为 @Component 更通用。它仅将您的类注册为 Spring Managed Bean。但是,@RestController 不仅将您的类注册为托管 bean,还进一步将其注册为对指定 URL 路径的 HTTP 调用的入口点。其他特定于层的注释(如 @Repository、@Configuration 等)也是如此



查看完整回答
反对 回复 2023-10-19
  • 4 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信