【刨根问底】在Springboot中MVC的常用注解<上>

我们再实际开发过程中一般大致为三层:controller/service/dao或者repository。其中本文最要是分享controller层相关的注解使用。常用的注解有:

  • @RestController
  • @RequestMapping
  • @PathVariable
  • @RequestParam
  • @RequestBody

@RestController

先看源码:

package org.springframework.web.bind.annotation;
//...无关多余的省略
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(annotation = Controller.class)
    String value() default "";
}

认真点看,这个注解上有两个曾经使用过的注解,一个@Controller和@ResponseBody。另外网上有人说@RestController是springboot的注解,这里得说清楚一下,并不是这样滴,请看下面:

跟springboot半毛钱关系都没有。回到前面,@Controller是标记这个类为controller类,@ResponseBody是将返回数据类型转换为json格式。所以在类上面加注解@RestController表示这个类是controller类并且方法返回参数均为json格式。但是在使用的时候需要注意,如果涉及到页面渲染或页面跳转的不能使用@RestController,只能使用原始的@Controller来处理,所以一般情况下@RestController的使用场景都是前后端分离。一下是一个使用场景:

public class User {
    private Integer userId;
    private String userName;
// set get  ....省略
}    
@RestController
public class RestControllerDemoController {
    @PostMapping("/getUserById")
    public Object getUserById(Integer id) {
        return new User(id, "Java后端技术栈");
    }
}

测试:

结果:

ok,以上已经成功,我们再回到@ResController换成@Controller将会是什么结果,

@Controller
public class RestControllerDemoController {
    @PostMapping("/getUserById")
    public Object getUserById(Integer id) {
        return new User(id, "Java后端技术栈");
    }
}

测试

再把代码的方法上加上@ResponseBody。

@Controller
public class RestControllerDemoController {
    @PostMapping("/getUserById")
    @ResponseBody
    public Object getUserById(Integer id) {
        return new User(id, "Java后端技术栈");
    }
}

再测试:

ok,证明了@RestController就是@Controller和@ResponseBody的集合体。

官方对@RestController的解释:

This code uses Spring 4’s new @RestController annotation, which marks the class as a controller where every method returns a domain object instead of a view. It’s shorthand for @Controller and @ResponseBody rolled together.

所以咱们可以这么理解:

@RestController=@Controller+@ResponseBody

既然是两个的集合体,那么我们可以分开去研究,先去看看@Controller。官方解释:

This annotation serves as a specialization of @Component, allowing for implementation classes to be autodetected through classpath scanning. It is typically used in combination with annotated handler methods based on the RequestMapping annotation.

此注解用作@Component的专用化,允许通过类路径扫描自动检测实现类。它通常与基于请求映射注解的带注解的处理程序方法结合使用。

看@Controller源码:

package org.springframework.stereotype;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(annotation = Component.class)
    String value() default "";
}

可以看到@Controller注解上有个注解@Component,其余三个注解不是我们本次所关心的,想了解请阅读文章Java注解--。这里就不多说了。

@Controller相当于dispatcherServlet+Model

@Controller同目录下的几个注解,并且@Component也在这个目录下。

1,@Controller所用是 控制器(注入服务):用于标注控制层,相当于struts中的action/controller层,

2,@Service作用是 服务(注入):用于标注服务层,主要用来进行业务的逻辑处理,比如:

@Service("userService")
public UserServiceImpl implements UserService{
 //....
}

,然后再对应需要使用的地方注入,

@Resource("userService")
private UserService userServie;

3,@repository作用是(实现dao访问):用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。

4,@Component其中前面三个注解上都有@Component注解, (该注解是把普通pojo实例化到spring容器中,相当于配置文件中的

<bean id="user" class="com.lawt.domain.User"/>)

泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Service等的时候),我们就可以使用@Component来标注这个类。

案例:

<context:component-scan base-package="com.lawt.*"> 

上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包并且被扫描的类上必须被

@Controller 、@Service、@Repository 、@Component

注解中的一个注解,都会把这些类纳入进spring容器中进行管理。

本文分享自微信公众号 - Java后端技术栈(t-j20120622)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端加油站

什么是JSON

我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify后的字符串是怎样的?先不要急着复制粘贴到控制台...

38020
来自专栏大数据学习笔记

ajax提交JSON数组及Springboot接收转换为list类

版权声明:本文为博主原创文章,欢迎转载。 ...

22340
来自专栏月牙寂

以太坊源码分析---go-ethereum之rpc

版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转...

16520
来自专栏月牙寂

Gorilla源码分析之gorilla/rpc源码分析

版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转...

12030
来自专栏java 微风

VUE 项目中引入 json 配置

版权声明:这可是本菇凉辛辛苦苦原创的,转载请一定带上我家地址,不要忘记...

17830
来自专栏程序员小王

【Python爬虫】初识爬虫(1)

之前写了两篇关于爬虫的文章微信好友大揭秘,赵雷到底在唱什么,纯粹是自己的兴趣引导自己学习爬虫,关注里应该有好多对爬虫感兴趣的小伙伴,为了巩固自己的爬虫知识,从今...

11020
来自专栏MudOnTire

还学不会webpack?看这篇!

Webpack已经流行好久了,但很多同学使用webpack时还是一头雾水,一下看到那么多文档、各种配置、各种loader、plugin立马就晕头转向了。我也不例...

12340
来自专栏数据挖掘

python3抓取异步百度瀑布流动态图片(一)查找post并伪装头方法

用火狐打开百度图片-->打开firebug-->输入GIF图-->搜索-->点击网络-->全部

13140
来自专栏数据挖掘

唯品会数据采集-异步瀑布流 python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解

采集入口为手机端,在火狐浏览器下ctrl+shift+M进入手机模式,并点击触屏模式,进入唯品会网站m.vip.com,刷新网页。

14650
来自专栏前端加油站

win10 MongoDB 服务自启动及数据导出

版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

12030

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励