Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的@RequestMapping,到了新版本被下面新注释替代,相当于增加的选项:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。
如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
新方法可以简化为:
@GetMapping("/get/{id}")
如何工作?
所有上述注释都已在内部注释了@RequestMapping以及方法元素中的相应值。
例如,如果我们查看@GetMapping注释的源代码,我们可以看到它已经通过以下方式使用RequestMethod.GET进行了注释:
@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = { RequestMethod.GET })
public @interface GetMapping {
// abstract codes
}
所有其他注释都以相同的方式创建,即@PostMapping使用RequestMethod.POST进行注释,@ PutMapping使用RequestMethod.PUT进行注释等。
使用方式
下面是结合RestController的简单使用:
@RestController
@RequestMapping("users")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/status/check")
public String status()
{
return "working";
}
@GetMapping("/{id}")
public String getUser(@PathVariable String id)
{
return "HTTP Get was called";
}
@PostMapping
public String createUser(@RequestBody UserDetailsRequestModel requestUserDetails)
{
return "HTTP POST was called";
}
@DeleteMapping("/{userId}")
public String deleteUser(@PathVariable String userId)
{
return "HTTP DELETE was called";
}
@PutMapping("/{userId}")
public String updateUser(@PathVariable String userId, @RequestBody UserDetailsRequestModel requestUserDetails)
{
return "HTTP PUT was called";
}
}
下面是使用@Controller的代码:
@Controller
public class HomeController
{
@GetMapping("/")
public String homeInit(Model model) {
return "home";
}
}
写法对比
@RequestMapping:
@RequestMapping(value = "/workflow",
produces = {"application/json"},
consumes = {"application/json"},
method = RequestMethod.POST)
@PostMapping如下:
@PostMapping(path = "/members", consumes = "application/json", produces = "application/json")
public void addMember(@RequestBody Member member) {
//code
}