点击 ➕ 关注「iBroPro」
朱少 · iBP(爱比皮) · 请星标
@RestController 和 @Controller ,两者看上去就有一定的血缘关系,那么他们究竟有哪些爱恨情仇,渊源关系呢?
▍先说下结论:
@RestController = @Controller + @ResponseBody
@Controller 注解的 Controller 类中的函数可以返回具体的页面。比如直接返回的 String 类型的Jsp、Html 页面名字,或者通过 ModelAndView.setViewName() 来指定页面名字。
但如果需要返回 Json 等类型的数据,则需要在函数上面再添加一个注解 @ResponseBody。
而通过 @RestController 注解的类,其中的函数不可以返回页面路径,只可以返回具体的结果值,比如查询完的对象、对象列表,最终呈现出来就是常用的 Json 等类型的值。
这也是为什么我们通过 @RestController 注解的类,返回得到值后,未加处理,总是得到 Json 类型的值。
因为它已经自动做了处理。如果使用 @RestController 注解的类,再想返回页面路径,得到的值则为 null。
你在项目开发过程中使用哪一个多呢?
下面通过源码看一下 @RestController:
@RestController
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Controller;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
可以看到,它被加上了 @Controller 和 @ResponseBody 注解。恍然大明白,有没有。
再看下 @Controller 和 @ResponseBody 的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
在合适的地方,选用合适的人才,让工作事半功倍。
感谢阅读,感谢陪伴。
参考文章:
https://www.cnblogs.com/shuaifing/p/8119664.html