腾讯一面RequestMapping注

在我们使用现有的Spring框架生态做开发时,我们接触到了很多注解,比如

Service(标注业务层)、

RequestMapping(标注映射路径)、

RequestParam(标注参数)、

Controller(标注控制层)等等。这些注解的存在在很大程度上,帮助我们简化了开发,今天我们来研究下

RequestMapping注解。

一、源码分析

源码分析:

Target({ElementType.TYPE,ElementType.METHOD})

Retention(RetentionPolicy.RUNTIME)

Documented

Mapping

public

interfaceRequestMapping{

//为映射分配一个名称。在类型级别和方法级别都支持!

Stringname()default"";

//为映射的路径起一个别名//例如

RequestMapping("foo")等价于

RequestMapping(path="foo")

AliasFor("path")

String[]value()default{};

AliasFor("value")

String[]path()default{};

//支持的HTTP请求类型,主要可以处理的请求方式有GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE等

RequestMethod[]method()default{};

//指定request中必须包含某些参数值,才让该方法处理

String[]params()default{};

//指定request中必须包含某些指定的header值,才能让该方法处理请求

String[]headers()default{};

//指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;

String[]consumes()default{};

//指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

String[]produces()default{};

}

Target中有两个属性,分别为ElementType.METHOD和ElementType.TYPE,表明

RequestMapping可以在方法和类的声明中使用。

我们还可以看到注解中的属性除了name()返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如value()和path()都可以同时定义多个字符串值来接收多个URL请求。

二、可标注位置说明

RequestMapping注解可标注位置

情况一:

类级别

RequestMapping注解可以放在类上,也可以直接放在方法上。

RequestMapping位于类上时,表示对应的路径映射对整个类中的方法都生效,访问类中的某个方法时,必须在其子映射路径上加上类上的映射路径。

比如如下代码访问:

RestController

RequestMapping(value="/user")

publicclassLoginController{

Autowired

privateLoginServiceloginService;

Autowired

privateStringRedisTemplatestringRedisTemplate;

Autowired

privateHttpServletRequestrequest;

/**

*用户登录

*

paramusername

*

parampassword

*

return

*/

GetMapping("/login")

publicResultlogin(Stringusername,Stringpassword){

//用户登录完成获取令牌

AuthTokenauthToken=loginService.login(username,password);

//获取用户登录时候的ip地址

StringipAddress=IpUtil.getIpAddress(request);

//将用户的令牌和ip地址绑定,将数据存储到redis中去

stringRedisTemplate.opsForValue().set(ipAddress,authToken.getAccessToken());

returnResult.ok(authToken);

}

}

如果我们想要访问login方法,则路径需要这样写:localhost:/user/login,在login方法的login映射路径前,加上LoginController类上指定的请求路径/user才可以。

情况二:

方法级别

RequestMapping注解位于方法上时,表示指明了这个方法的请求映射路径,如果类上没有使用

RequestMapping注解标注相关请求路径,则可以直接访问方法上的映射路径来直接访问方法。

比如如下代码访问:

RestController

publicclassFileController{

Value("${fileServer.url}")

privateStringurl;

/**

*文件上传

*

paramfile

*

return

*/

PostMapping(value="/fileUpload")

publicResultfileUpload(

RequestParam("file")MultipartFilefile)throwsException{

//文件上传

returnResult.ok(url+FastDfsUtil.upload(file));

}

}

此时,FileController类上并没有请求路径映射,

我们可以直接通过locahost:/fileUpload来访问fileUpload文件上传方法。

三、注解作用说明

RequestMapping注解作用

RequestMapping注解的作用是将请求和处理请求的控制器方法关联起来,在请求与处理方法之间,建立映射关系。

四、注解属性运用说明

RequestMapping注解属性代码测试分析

下面我们就通过测试代码,来看下

RequestMapping注解中的属性具体是如何进行使用的。

情况一:测试value属性

//value可以省略不写的

RequestMapping(value="/testValue")

publicStringtestValue(){

return"测试

RequestMapping注解属性-value";

}

浏览器输入请求


转载请注明:http://www.aierlanlan.com/rzgz/8827.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了