服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Spring 新特性,正式“抛弃”Feign了

日期: 来源:大侠学JAVA收集编辑:

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

来源:juejin.cn/post/7173271507047546893

相关阅读

  • 详解 Java 泛型,写得太好了!

  • -正文泛型—— 一种可以接收数据类型的数据类型,本文将通俗讲解Java泛型的优点、方法及相关细节。一、泛型的引入我们都知道,继承是面向对象的三大特性之一,比如在我们向集合中
  • 写了个工具,CRUD 开发效率直接提升100倍!

  • 最近在做一个项目,需要新建20多张表相信大多数同学应该和我一样,都是比较讨厌创建新表这个工作的,因为每创建一张表,都要去创建实体类、创建增删改查的接口、编写增删改查的SQL
  • ChatGPT上线微软必应搜索,现在就能用!

  • 来源:量子位 | 公众号 QbitAI没有最早,只有更早。就在谷歌预告Bard之后,微软已经抢先推出新版Bing和Edge浏览器。ChatGPT支持,现在即可用。而且在浏览器的搜索框内,微软非常自信
  • Windows 杂乱桌面整理终极工具来袭!

  • THE START之前一直有小伙伴咨询关于桌面整理的软件今天它来了,并且是一款比较优秀的国产软件--小智桌面。小智桌面是集“文件整理、文件搜索、待办提醒、桌面壁纸”为一体的
  • Global Mapper Pro 24最新版!

  • THE START作为一款先进而全面的地理空间软件,Global Mapper Pro在地形分析、点云编辑、无人机收集的图像处理等方面表现出色。该程序的最新版本致力于扩展这一功能,包括Python
  • SAS JMP Pro 17.0 最新版!

  • THE START更新SAS JMP Pro 17.0 最新专业版,自2021年后的最近一次大版本更新,此版本更新了工作流构建器、Easy DOE、搜索联合监测平台、JMP实时新功能、OSIsoft PI Import、新
  • 一文深入理解 Java 的四种引用类型

  • 这是 JsonChao 的第 318 期分享前言Java Reference 类型是与虚拟机垃圾回收机制密切相关的知识点,同时也是面试重要考点之一。一般认为 Java 有四种 Reference(强引用 & 软引
  • Flutter 系列(二):Dart 语法筑基

  • 这是 JsonChao 的第 318 期分享前言在本系列的上一篇文章中,我们介绍了 Flutter 开发环境搭建,以及使用 AndroidStudio 运行你的第一个 Flutter 项目,体验了热重载。还没有看过

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 第二届全国职业技能大赛将于9月举办

  •   新华社北京2月28日电(记者魏弘毅)28日,人力资源和社会保障部职业能力建设司副司长王晓君表示,第二届全国职业技能大赛将于今年9月16日至19日在天津市举办。  在当日举行的
  • Spring 新特性,正式“抛弃”Feign了

  • 近期,Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后
  • 疯了,12306真扛住了!

  • 最近面试的、跳槽的一波又一波,学习群里也异常活跃,很多小伙伴在里面反馈问题,一起复盘,还是很有收获的。有面了十多家一二线互联网公司的卷王谈到,发现在Java后端面试中,Redis是
  • 详解 Java 泛型,写得太好了!

  • -正文泛型—— 一种可以接收数据类型的数据类型,本文将通俗讲解Java泛型的优点、方法及相关细节。一、泛型的引入我们都知道,继承是面向对象的三大特性之一,比如在我们向集合中
  • 一个通用面试神器

  • 前两个月,公司java岗位面了50+候选人,面试下来发现几类过不了的情况,分享大家防止踩坑:新技术倒是掌握得挺多,基础的却一塌糊涂。工作多年,从未学习过工作之外的技术栈,也没有对技
  • 写了个工具,CRUD 开发效率直接提升100倍!

  • 最近在做一个项目,需要新建20多张表相信大多数同学应该和我一样,都是比较讨厌创建新表这个工作的,因为每创建一张表,都要去创建实体类、创建增删改查的接口、编写增删改查的SQL