【Spring】Spring 6 新特性一一HTTP Interface Myth丶恋晨 2024-03-27 09:46 48阅读 0赞 ## 简介 ## Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。 这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。下面我们参考官方文档来完成一个 Demo。 ## Http Demo ## 首先创建一个简单的 HTTP 服务,这一步可以创建一个简单的 Spring Boot 工程来完成。 先创建一个实体类: public class User implements Serializable { private int id; private String name; // 省略构造方法、Getter和Setter @Override public String toString() { return id + ":" + name; } } 再写一个简单的 Controller: @GetMapping("/users") public List<User> list() { return IntStream.rangeClosed(1, 10) .mapToObj(i -> new User(i, "User" + i)) .collect(Collectors.toList()); } 确保启动服务之后,能够从http://localhost:8080/users地址获取到一个包含十个用户信息的用户列表。 下面我们新建一个 Spring Boot 工程。 ![在这里插入图片描述][b67f86738c1f48eeb9f0a9cfc1ab57d0.png] 这里需要注意,Spring Boot 的版本至少需要是 3.0.0,这样它以来的 Spring Framework 版本才是 6.0 的版本,才能够包含 HTTP Interface 特性,另外,Spring Framework 6.0 和 Spring Boot 3.0 开始支持的 Java 版本最低是 17,因此,需要选择至少是 17 的 Java 版本。 另外,需要依赖 Spring Web 和 Spring Reactive Web 依赖,原因下文中会提到。 创建好新的 Spring Boot 工程后,首先需要定义一个 HTTP Interface 接口。最简单的定义如下即可: public interface UserApiService { @GetExchange("/users") List<User> getUsers(); } 然后,我们可以写一个测试方法。 @Test void getUsers() { WebClient client = WebClient.builder().baseUrl("http://localhost:8080/").build(); HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build(); UserApiService service = factory.createClient(UserApiService.class); List<User> users = service.getUsers(); for (User user : users) { System.out.println(user); } } 最终回打印获取到的是个用户信息: 1:User1 2:User2 … 9:User9 10:User10 以上是一个最简单的示例,下面我们看看其中的一些细节。 ## GetExchange(HttpExchange)注解 ## 上文例子中的 GetExchange 注解代表这个方法代替执行一个 HTTP Get 请求,与此对应,Spring 还包含了其他类似的注解: ![在这里插入图片描述][65e37450a1b34c09b9beb37a7ce70372.png] 这些注解定义在`spring-web`模块的`org.springframework.web.service.annotation`包下,除了 `HttpExchange` 之外,其他的几个都是 `HttpExchange` 的特殊形式,这一点与 Spring MVC 中的 `RequestMapping/GetMapping` 等注解非常相似。 以下是 HttpExchange 的源码: @Target({ ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping @Reflective(HttpExchangeReflectiveProcessor.class) public @interface HttpExchange { @AliasFor("url") String value() default ""; @AliasFor("value") String url() default ""; String method() default ""; String contentType() default ""; String[] accept() default { }; } 在上面的例子中,我们只指定了请求的资源路径。 ## UserApiService 实例的创建 ## 在上面例子中,我们定义的 HTTP Interface 接口是 UserApiService,在测试方法中,我们通过 HttpServiceProxyFactory 创建了 UserApiService 的实例,这是参考了 Spring 的官方文档的写法。 你也可以将创建的过程写到一个 @Bean 方法中,从而可以将创建好的实例注入到其他的组件中。 我们再定义 UserApiService 的时候,只是声明了一个接口,那具体的请求操作是怎么发出的呢,我们可以通过 DEBUG 模式看得出来,这里创建的 UserApiService 的实例,是一个代理对象: ![在这里插入图片描述][723a076a07c84145a5359a08b002f2a8.png] 目前,Spring 还没有提供更方便的方式来创建这些代理对象,不过,之后的版本肯定会提供,如果你感兴趣的话,可以从 HttpServiceProxyFactory 的createClient方法的源码中看到一些与创建 AOP 代理相似的代码,因此,我推测 Spring 之后可能会增加类似的注解来方便地创建代理对象。 ## 其他特性 ## 除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVC 的 Controller 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。 ## 为什么需要 Spring Reactive Web 的依赖 ## 上文中创建工程的时候,引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。这是因为,HTTP Interface 目前只内置了 WebClient 的实现,它属于 Reactive Web 的范畴。Spring 在会在后续版本中推出基于 RestTemplate 的实现。 ## 总结 ## 本文带你对 HTTP Interface 特性进行了简单的了解,我之后会深入研究这个特性,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注。 [b67f86738c1f48eeb9f0a9cfc1ab57d0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/5897267f3e454250aec25f7df1cee5cb.png [65e37450a1b34c09b9beb37a7ce70372.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/f13afdfe1ec145cebe4afe8b375a1069.png [723a076a07c84145a5359a08b002f2a8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/27/1c8a566fe91a4e7ebb1e4fc5c3964324.png
相关 ES6新特性 ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下⼀个版本标准,2015.06 发版。ES6 主要是为了解决 ES5 的先天不⾜,⽐如 Jav... 矫情吗;*/ 2024年04月21日 08:03/ 0 赞/ 105 阅读
相关 【Spring】Spring 6 新特性一一HTTP Interface 简介 Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。 这个新特性,可以让开发者将 HTTP 服务,定义成一个包 Myth丶恋晨/ 2024年03月27日 09:46/ 0 赞/ 49 阅读
相关 ES6新特性 文章目录 一、ECMASript 介绍 二、ES6 新特性 2.1 let、const 关键字 2.2 变量的解构赋值 ゝ一世哀愁。/ 2022年09月06日 15:27/ 0 赞/ 304 阅读
相关 es6新特性 1.let && const •都是块级作用域 •不能重复定义 •避免了变量提升 ① let命令也用于声明对象,但是作用域为局部。 ![在这里插入图片描述][ 红太狼/ 2022年03月07日 21:24/ 0 赞/ 397 阅读
相关 es6新特性 es6语法 > es6语法用起来是十分方便的,但是有些浏览器还是不支持,但是做大型项目中基本上要用到转码器(babel转码器),可以把es6语法转为es5直接使用。 T 落日映苍穹つ/ 2022年01月25日 15:30/ 0 赞/ 395 阅读
相关 ES6新特性 转:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] co Bertha 。/ 2022年01月12日 02:19/ 0 赞/ 374 阅读
相关 ES6新特性 转自:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] 1.con 冷不防/ 2021年12月18日 07:07/ 0 赞/ 370 阅读
相关 es6新特性 https://www.cnblogs.com/minghui007/p/8177925.html 转载于:https://www.cnblogs.com/LWWTT/p/1 野性酷女/ 2021年11月02日 14:58/ 0 赞/ 536 阅读
相关 ES6新特性 1.变量声明let和const 在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: 我会带着你远行/ 2021年10月29日 07:08/ 0 赞/ 547 阅读
相关 ES6新特性 1.声明变量的关键字:const 和 let JavaScript ES6中引入了另外两个声明变量的关键字:const和let。在ES6中,我们将很少能看到var了。 co 电玩女神/ 2021年09月17日 01:12/ 0 赞/ 532 阅读
还没有评论,来说两句吧...