前言
上一次详解了@RestController注解,其中包括重要的@Controller等注解,这次来研究一下常用的@RequestMapping注解
@RequestMapping
This annotation can be used both at the class and at the method level. In most cases, at the method level applications will prefer to use one of the HTTP method specific variants
这个注释可以在类级和方法级使用。在大多数情况下,在方法级别上,应用程序更愿意使用HTTP方法特定的变体之一,这表明了我们使用的场景
- 类头
- 方法头
它一共有5种请求的方式:
1 | * @see GetMapping |
源码分析
1 | @Target({ElementType.METHOD, ElementType.TYPE}) |
它包含以上注释
- 他是方法级别,或者类/接口级别
- 他是在运行时由VM保留的
- 他会被记录到javadoc种,作为公共api接口
- 他是一个Mapping
name
现在我们继续看RequestMapping的源代码
1 | /** |
简单来说就是给你的RequestMapping起个名字,在类型级别和方法级别都支持!当在这两个级别上使用时,组合名称由“#”作为分隔符连接派生。
value
1 | /** |
通过注解知道它和path是同一个意思,,可以是一个数组,默认是{}
This is an alias for path()
. For example @RequestMapping("/foo")
is equivalent to @RequestMapping(path="/foo")
.
path
1 | /** |
这里比较重要,path的书写方式很丰富,应当注意积累
method
1 | /** |
方法一共有一下集中可以指定:
1 | public enum RequestMethod { |
这些都应该详细了解一下,在实战中具体应用
params
1 | /** |
映射请求的参数,缩小主映射。
适用于任何环境的相同格式:“myParam=myValue”样式表达式序列,只有在发现每个参数都具有给定值时才映射请求。表达式可以通过使用“!”=”运算符,如”myParam!=myValue”。还支持“myParam”样式表达式,这些参数必须出现在请求中(允许有任何值)。最后,”!“myParam”样式表达式表示指定的参数不应该出现在请求中。
在类型级别和方法级别都支持!当在类型级使用时,所有方法级映射都继承这个参数限制(即在解析处理程序方法之前检查类型级限制)。
参数映射被认为是在类型级别强制执行的限制。主路径映射(即指定的URI值)仍然必须惟一地标识目标处理程序,参数映射只是表示调用处理程序的先决条件。
header
1 | /** |
支持媒体类型通配符(*),用于Accept和Content-Type等头部,比如:
1 | @RequestMapping(value = "/something", headers = "content-type=text/*") |
consumes
1 | /** |
在注视中也给出了用法
1 | consumes = "text/plain" |
produces
1 | /** |
It affects the actual content type written, for example to produce a JSON response with UTF-8 encoding,
它会影响实际编写的内容类型,例如生成一个带有UTF-8编码的JSON响应
综合以上的简介我们常用的其实也就是前面几个,后面的不是很常用
最后我们先来了解一下@Mapping这个注解
@Mapping
源码分析
1 | @Target({ElementType.ANNOTATION_TYPE}) |
他是RUNTIME的注释类型,很好理解,他的解释是:
1 | Meta annotation that indicates a web mapping annotation. |
表示web映射注释的元注释。