首页IT科技spring festival作文6句话六年级(正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!)

spring festival作文6句话六年级(正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!)

时间2025-06-16 10:28:23分类IT科技浏览4823
导读:来源:https://juejin.cn/post/7173271507047546893...

来源:https://juejin.cn/post/7173271507047546893

近期             ,Spring 6 的第一个 GA 版本发布了                    ,其中带来了一个新的特性——HTTP Interface             。这个新特性       ,可以让开发者将 HTTP 服务      ,定义成一个包含特定注解标记的方法的 Java 接口                    ,然后通过对接口方法的调用              ,完成 HTTP 请求                    。看起来很像使用 Feign 来完成远程服务调用      ,下面我们参考官方文档来完成一个 Demo       。

完成一个 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 工程              。Spring Boot 基础就不介绍了,推荐看这个免费教程:

https://github.com/javastacks/spring-boot-best-practice

这里需要注意                   ,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 还包含了其他类似的注解:

这些注解定义在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 的实例              ,是一个代理对象:

目前      ,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 特性进行了简单的了解                   ,我之后会深入研究这个特性              ,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注                    。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了              。      。                   。

3.Spring Boot 2.x 教程                   ,太全了!

4.别再写满屏的爆爆爆炸类了                    ,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布             ,速速下载!

觉得不错                    ,别忘了随手点赞+转发哦!

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
vue store数据更新页面没更新(vue开发中,数据更新,但视图不刷新) 公司网站设计中易错点详解(避免巧成拙,设计公司网站的10大技巧)