51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Spring Boot 3太强:全新Controller接口定义方式

环境:SpringBoot3.2.5



1. 回顾定义接口方式

1.1 常规定义* * * * * * * *

@RestController@RequestMapping("/users")public class UsersController {  @PostMapping()  public Object save(@RequestBody Users users) {    // ...  }}

99.9999%的人都是这样定义接口。

1.2 好奇定义
* * * * * * * * * * * *

@Component("/games/api")public class CustomController implements Controller {
  @Override  public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {    response.setContentType("text/html;charset=utf8");    PrintWriter out = response.getWriter() ;    out.print("<h1>Controller接口</h1>") ;    out.close() ;    return null ;  }}

这也就是看到时学习下,谁会用到工作中?

1.3 装逼定义* * * * * * * * *

@Component("/zhuangbi/api")public class ControllerHttpRequestHandler implements HttpRequestHandler {  public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    response.setContentType("text/html;charset=utf8");    PrintWriter out = response.getWriter() ;    out.print("<h1>你好,HttpRequestHandler</h1>") ;    out.close() ;  }}

这不就是在写Servlet吗!谁还记得如何编写Servlet?

以上是在Spring MVC中定义API接口的几种方式(纯Servlet就算了)。接下来我将介绍另外一种定义Controller接口的方式。

注意:接下来定义接口的方式需要在Spring6.0以上版本

2. 新的定义方式

从Spring6开始新增了一个新注解**@HttpExchange**。该注解将一个类或具体方法声明为HTTP 接口。接口的细节通过注解的属性以及方法参数定义。如下示例:

声明接口
* * * * * * * * * * * * * * *

@HttpExchange("/persons")interface PersonService {
  @GetExchange("/{id}")  Person getPerson(@PathVariable Long id);
  @PostExchange  void add(@RequestBody Person person) ;}// Person对象public class Person {  private Long id ;  private String name ;  // getters, setters}

实现接口* * * * * * * * * * * *

@RestControllerpublic class PersonController implements PersonService {
  public Person getPerson(@PathVariable Long id) {    return new Person(id, "姓名 - " + id) ;  }
  @ResponseStatus(HttpStatus.CREATED)  public void add(@RequestBody Person person) {    // TODO  }}

在该实现类上与普通Controller声明一样使用**@RestController**注解。

除了上面使用的**@GetExchange@PostExchange**,还有下面这几个注解:

  • @DeleteExchange

  • @PatchExchange

  • @PutExchange

与@RequestMapping一样,这里的**@HttpExchange**注解也可以直接使用到方法上,如下:
* * * *

@HttpExchange(value = "/list", method = "GET")default List<Person> listPerson() {  return List.of(new Person(666L, "李四")) ;} ;

在接口中声明一个默认的方法。

3. @HttpExchange真正目的

@HttpExchange的主要目的是使用生成的代理抽象HTTP客户端代码。如下示例

还是使用上面的PersonService接口定义,通过该接口生成代理类 * * * * * * * * * * * * * *

@Configurationpublic class PersonServiceClient {
  @Bean  PersonService personServiceProxy() {    RestClient restClient = RestClient.builder().baseUrl("http://localhost:8088").build();    RestClientAdapter adapter = RestClientAdapter.create(restClient);    HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
    PersonService personService = factory.createClient(PersonService.class);    return personService ;  }
}

PersonService创建代理对象,通过JDK代理。注意:这里的RestClient必须使用Spring6.1以上版本,如果你不是那你可以换成RestTemplate. * * * * * * *

@Resourceprivate PersonService personServiceProxy ;@GetMapping("/persons")public List<Person> list() {  return this.personServiceProxy.listPerson() ;}

目标服务接口如下:
* * * * * * * *

@GetMapping("/persons/list")public List<Person> list() {  return Arrays.asList(        new Person(1L, "张三", 20, "3@qq.com"),        new Person(2L, "李四", 25, "4@qq.com"),        new Person(3L, "王五", 55, "6666@qq.com")      ) ;}

输出结果

以上是本篇文章的全部内容

推荐文章

SpringBoot通过编程式事务提高系统性能

强烈建议JDK升级到17,因为这些功能

SpringBoot多租户3种架构实现方案详解

SpringBoot3.3.0版本发布了!速看都更新了什么?

必须掌握SpringBoot强大的自定义属性配置

Spring非常强大的2个类知道的人不多

Spring注入还可以这样玩!涨知识了

SpringBoot项目中这10个开发技巧你都知道吗?

Spring6.2这几个新功能及优化太强了

SpringBoot3使用虚拟线程一定要小心了

Spring6.2新特性@Fallback候选Bean

赞(3)
未经允许不得转载:工具盒子 » Spring Boot 3太强:全新Controller接口定义方式