【SpringBoot】常用的的各种注解(二):Controller层相关注解

本文将介绍Controller层的相关注解,带着介绍一些有联系的注解

@Component

@Component注解的作用很简单,直接在类上使用,就是把这个类注入到Spring容器中,且默认的Bean名称为类名的首字母小写。也可以在使用该注解的时候指定Bean的名称。

@Controller、@Service、@Repository

@Controller@Service@Repository这三个注解本质上都是@Component
只不过用来标识不同的分层而已.
@Controller标识的类,该类代表控制器类(控制层/表现层)
@Service标识的类,该类代表业务逻辑层
@Repository标识的类,该类代表Dao层/持久层
可以看下 @Controller的源码

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

@ResponseBody

@ResponseBody作用于Controller的方法上,它的作用是将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
当方法上面没有写@ResponseBody时,底层会将方法的返回值封装为ModelAndView对象。
加了@ResponseBody后,如果返回值是字符串,那么直接将字符串返回;如果是一个对象,会将对象转化为json串返回。

@RestController

@RestController本质上是@Controller@ResponseBody的组合,明白了这两个注解的作用,自然就理解了它的作用。我们可以看一下@RestController的源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

@RequestMapping

@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求,可以用在类或方法上。

@RequestMapping可以标注的位置

标注在类上

用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径

标注在方法上

用于方法上,表示在类的父路径下追加方法注解中的地址将会访问到该方法

@RequestMapping的属性

先看一下源码,有哪些属性(这些属性的设置是用来匹配请求的,不是用来设置请求的

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

value属性

  • @RequestMappingvalue 属性必须设值;
  • @RequestMappingvalue 属性是用来指定当前请求的请求地址
  • 从上面的源码中可以看到value属性是一个字符串类型的数组,因此说明可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的数组

method属性

  • @RequestMappingmethod属性用来指定当前方法的请求方式
  • @RequestMapping可以设置多种请求方式
  • @RequestMapping默认支持所有请求方式

params属性

  • @RequestMappingparams属性用来设置当前请求的请求参数;
  • @RequestMappingparams属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系
  1. “param”:要求请求映射的请求必须为包含 param的请求参数
  2. “!param”:要求请求映射的请求是不能包含param的请求参数
  3. “param=value”:要求请求映射的请求必须包含 param 的请求参数,且 param 参数的值必须为 value
  4. “param!=value”: 要求请求映射的请求是必须包含 param 的请求参数,其值不能为 value。

headers属性

  • @RequestMappingheaders属性用来设置当前请求的请求头信息;
  • @RequestMappingheaders属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系
  1. “header”:要求请求映射的请求必须为包含 header的请求头信息
  2. “!header”:要求请求映射的请求必须为不包含 header的请求头信息
  3. “header=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须为value
  4. “header!=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须不是value

@GetMapping、@PostMapping

实际项目中,我们使用的最多的还是@GetMapping@PostMapping注解,这两个注解本质上是指定了请求方式的@RequestMapping注解,不过更加直观,所以实际使用场景较多。我们可以看一下@GetMapping的源码

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(
    method = {RequestMethod.GET}
)
public @interface GetMapping {
    @AliasFor(
        annotation = RequestMapping.class
    )
    String name() default "";

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] value() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] path() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] params() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] headers() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] consumes() default {};

    @AliasFor(
        annotation = RequestMapping.class
    )
    String[] produces() default {};
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值