@Controller 与 @RestController 的区别
@Controller
@Controller
注解把类注册进Spring容器中,让Spring容器来管理这个类,并告诉Spring容器这个类是一个控制器。@Controller
注解可以认为是被标注类的原型(stereotype),表明了这个类所承担的角色。分派器(DispatcherServlet
)会扫描所有注解了@Controller
的类,检测其中通过@RequestMapping
注解配置的方法(详见下一小节)。
除了使用 @Controller 注解的方式注册一个控制器,也可以使用原生的 Spring 配置的方式在容器中显示的注册一个 Spring bean。如果想要使用注解的方式来注册控制器,那么必须在你需要在配置中加入组件扫描的配置代码来开启框架对注解控制器的自动检测。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.pudding" />
</beans>
@RestController
当今让控制器实现一个REST API是非常常见的,这种场景下控制器只需要提供JSON、XML或其他自定义的媒体类型内容即可。你不需要在每个
@RequestMapping
方法上都增加一个@ResponseBody
注解,更简明的做法是,给你的控制器加上一个@RestController
的注解。
@RestController
是一个原生内置的注解,它结合了@ResponseBody
与@Controller
注解的功能。不仅如此,它也让你的控制器更表义,而且在框架未来的发布版本中,它也可能承载更多的意义。
上一节已经说过 @Controller 的作用了,但是有一点需要注意的是,除了 @Controller 以外还有一个 @RestController 。在上一节的例子中能看到使用 @Controller 标注的类的返回值是一个画面的路径。在浏览器请求路径之后会跳转到 return 返回的画面中。如果使用 @RestController 标注的话,return 返回的将不会是一个画面而是一个内容。例如,return /WEB-INF/views/success.jsp
则会返回/WEB-INF/views/success.jsp
这个内容而不是跳转画面。
其实 @RestController 相当于 @Controller + @ResponesBody。
总的来说就是,如果你想使用控制器处理完请求之后跳转到画面那么你就使用 @Controller 。而如果你想向画面返回一些内容,例如,返回JSON,XML或自定义mediaType内容到页面,那么 @RestController 更适合你。
下面举一个 @RestController 的简单例子:
package com.pudding.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String hello() {
return "Hello World!";
}
}
上面的例子直接向浏览器返回了 Hello World!
而不是跳转画面。