Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的 @RequestMapping ,到了新版本被下面新注释替代,相当于增加的选项:
从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即 @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"; } }
在上面的代码中,HomeController类充当请求控制器。它的homeInit()方法将处理所有传入的URI请求"/"。它接受a Model并返回视图名称home。使用配置的 视图解析器解析 视图名称”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 }