• 【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 "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    @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 "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    @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 {};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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 {};
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    2023-2028年中国高纯度糖精市场运营模式分析及发展趋势研究报告
    GaussDB数据库SQL系列-数据去重
    工业无线网关在实际生产中的应用效果和价值-天拓四方
    macbook电脑磁盘满了怎么删东西?
    《实战:如何搭建一个完整的 Vue2.0 项目》- 7、Vue2.x 项目 webpack 4 升级 5(半自动升级)
    面向对象三大特征之多态
    client-go实战之七:准备一个工程管理后续实战的代码
    nodejs创建web服务器
    【JavaScript复习五】内置对象string查找类方法
    Redis系列:HyperLogLog实现海量数据基数统计
  • 原文地址:https://blog.csdn.net/Qy1997/article/details/127603329