Spring MVC 核心注解
-
@Controller
- 用于标记一个类作为Spring MVC中的控制器,此类中包含处理HTTP请求的方法。
-
@RequestMapping
- 可以在类或方法级别使用,将特定的URL映射到处理请求的方法。
- 属性包括:
value
或path
: 指定请求的URI模板。method
: 指定HTTP请求方法(如GET、POST等)。params
: 指定请求必须包含的参数列表。headers
: 指定请求头信息过滤条件。consumes
和produces
: 定义请求和响应的内容类型(MIME类型)。
-
@GetMapping
,@PostMapping
,@PutMapping
,@DeleteMapping
,@PatchMapping
- 这些是
@RequestMapping
针对具体HTTP方法的快捷方式。
- 这些是
-
@PathVariable
- 用于从URI路径变量中获取值并注入到控制器方法参数中。
-
@RequestParam
- 绑定HTTP请求参数到控制器方法参数。
-
@RequestBody
- 将HTTP请求体内容反序列化为对象,并注入到控制器方法参数中。
-
@RequestHeader
- 从HTTP请求头中提取指定值并绑定到控制器方法参数。
-
@CookieValue
- 获取HTTP请求中的Cookie值并将其注入到控制器方法参数。
-
@ModelAttribute
- 在方法参数或方法上使用,表示该参数应由模型属性解析器填充或触发方法来准备模型数据。
-
@SessionAttributes
- 类级别的注解,声明将在HTTP会话中保存的模型属性名。
-
@InitBinder
- 标记在方法上,允许自定义数据绑定逻辑,在数据绑定到命令对象之前执行。
-
@ExceptionHandler
- 处理控制器方法抛出的异常,返回视图或错误响应。
-
@RestController
- 结合了
@Controller
和@ResponseBody
的功能,表明该控制器的所有方法都将直接返回HTTP响应体内容而非视图名。
- 结合了
请注意,实际开发中还存在其他辅助注解和功能性的注解,例如用于验证请求数据的JSR-303/JSR-349注解(如@NotNull
, @Size
等),以及处理跨域请求的@CrossOrigin
注解等。
Spring Cloud Feign 中对 Spring MVC 注解的使用
在Spring Cloud Feign中,尽管Feign本身是一个独立的声明式HTTP客户端库,但它通过Spring Cloud的集成实现了对Spring MVC注解的良好支持。因此,可以在Feign接口的方法上使用部分Spring MVC注解来定义服务调用约定。
示例1 - 使用 @RequestMapping:
@FeignClient(name = "serviceA")
public interface ServiceAClient {
@RequestMapping(method = RequestMethod.GET, value = "/api/data")
DataResponse getData(@RequestParam("param1") String param1);
}
在此示例中,@RequestMapping用于映射到目标服务特定的URL路径(/api/data)及HTTP方法(GET),同时处理请求参数。
示例2 - 使用 @GetMapping, @PostMapping 等快捷方式注解:
@FeignClient(name = "serviceB")
public interface ServiceBClient {
@GetMapping("/api/users/{id}")
User getUserById(@PathVariable("id") Long id);
@PostMapping("/api/users", consumes = MediaType.APPLICATION_JSON_VALUE)
User createUser(@RequestBody CreateUserRequest request);
}
示例3 - 使用 @RequestParam, @PathVariable, @RequestHeader:
这些Spring MVC注解在Feign接口中同样有效,用于处理请求参数、路径变量和请求头信息。
@FeignClient(name = "serviceD")
public interface ServiceDClient {
// 使用 @RequestParam 注解处理查询参数
@GetMapping("/api/search")
SearchResponse search(@RequestParam("query") String query,
@RequestParam(value = "page", required = false, defaultValue = "1") int page);
// 使用 @PathVariable 注解处理路径变量
@GetMapping("/api/users/{userId}/profile")
UserProfile getUserProfile(@PathVariable("userId") Long userId);
// 使用 @RequestHeader 注解处理请求头信息
@PostMapping("/api/protected-resource")
Response getProtectedResource(@RequestHeader("Authorization") String authorizationToken);
}
示例4 - 使用 @Headers:
@FeignClient(name = "serviceC")
public interface ServiceCClient {
@GetMapping("/api/files")
FileResource getFile(
@RequestParam("fileId") String fileId,
@RequestHeader("Authorization") String authorizationToken,
@Headers("Accept: application/octet-stream")
);
}
虽然@Headers并非Spring MVC标准注解,但在Feign中可以用来为请求添加固定的请求头信息。
总之,在Spring Cloud环境中,Feign与Ribbon或LoadBalancerClient配合实现负载均衡,并可通过Hystrix(如果启用)进行熔断保护。通过支持Spring MVC注解,编写Feign接口时能获得更加直观且易于理解的代码结构,从而更好地整合到Spring Boot应用体系中。