Spring 6 正式“抛弃”feign

news2024/9/24 15:28:53

近期,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 的实例,是一个代理对象:
在这里插入图片描述

其他特性

除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVC 的 Controller 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。

为什么需要 Spring Reactive Web 的依赖

上文中创建工程的时候,引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。这是因为,HTTP Interface 目前只内置了 WebClient 的实现,它属于 Reactive Web 的范畴。Spring 在会在后续版本中推出基于 RestTemplate 的实现。

总结

本文带你对 HTTP Interface 特性进行了简单的了解,我之后会深入研究这个特性,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink仿真封装中的参数个对话框设置

目录 参数和对话框窗格 初始化窗格 文档窗格 为了更加直观和清晰的分析仿真&#xff0c;会将多个元件实现的一个功能封装在一起&#xff0c;通过参数对话框窗格&#xff0c;可以使用参数、显示和动作选项板中的对话框控制设计封装对话框。如图所示&#xff1a; 参数和对话框…

刘二大人《Pytorch深度学习实践》第六讲逻辑斯蒂回归

文章目录线性回归和逻辑斯蒂回归的区别课上代码交叉熵函数的理解线性回归和逻辑斯蒂回归的区别 线性回归一般用于预测连续值变量&#xff0c;如房价预测问题。 线性回归的一般表达式为&#xff1a; 代价函数为MSE&#xff08;均方误差&#xff09;&#xff1a; 其中权重thet…

Linux Shell 实现一键部署二进制Rabbitmq

rabbitmq 前言 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代…

openai的whisper语音识别介绍

openAI发布了chatgpt&#xff0c;光环一时无两。但是openAI不止有这一个项目&#xff0c;它的其他项目也非常值得我们去研究学习。 今天说说这个whisper项目 https://github.com/openai/whisper ta是关于语音识别的。它提出了一种通过大规模的弱监督来实现的语音识别的方法。…

C++之深入解析STL unordered_map的底层实现原理

C STL 标准库中&#xff0c;不仅是 unordered_map 容器&#xff0c;所有无序容器的底层实现都采用的是哈希表存储结构。更准确地说&#xff0c;是用“链地址法”&#xff08;又称“开链法”&#xff09;解决数据存储位置发生冲突的哈希表&#xff0c;整个存储结构如下所示&…

JVM 垃圾收集器详解

一、垃圾收集器 如果说收集算法是内存回收的方法论&#xff0c;那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定&#xff0c;因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别&#xff0c;不同的虚…

基于遗传算法的中药药对挖掘系统的设计与实现

用数据挖掘技术研究了中药方剂配伍的规律。主要工作&#xff1a;分析了关联规则存在的问题&#xff0c;引入双向关联规则的概念&#xff1b;介绍了遗传算法的基本原理&#xff0c;研究了遗传算法在数据挖掘中的应用&#xff1b;将方剂库转换为位图矩阵&#xff0c;大大提高搜索…

Mac重启清理缓存会怎么样 mac清理缓存怎么清理

众所周知&#xff0c;Mac电脑有着流畅的操作系统&#xff0c;因此&#xff0c;很多用户都会选择使用Mac电脑办公。随着日常使用&#xff0c;系统缓存数据越来越大&#xff0c;某些Mac电脑&#xff08;尤其是小内存版本的Mac电脑&#xff09;可能会出现“系统”占存储空间比例较…

初始单片机.md

1.如何将HEX文件烧录到单片机 STC-ISP STC-ISP是一款单片机下载编程烧录软件&#xff0c;是针对STC系列单片机而设计的&#xff0c;可下载STC89系列、12C2052系列和12C5410等系列的STC单片机&#xff0c;使用简便。 思路&#xff1a;将电脑磁盘上已存在的文件通过串口的方式下…

python中第三方库xlrd和xlwt的使用教程

excel文档名称为联系人.xls&#xff0c;内容如下&#xff1a; 一、xlrd模块用法 1.打开excel文件并获取所有sheet import xlrd# 打开Excel文件读取数据 data xlrd.open_workbook(联系人.xls)sheet_name data.sheet_names() # 获取所有sheet名称 print(sheet_name) # [银…

python依次运行多个代码遇到的同步与异步问题

1、要实现在一个Python代码运行完后紧接着运行另一个Python代码&#xff0c;可以使用Python的subprocess模块。该模块可以创建新进程并与之交互&#xff0c;可以用于在Python代码中启动新的程序或脚本。 下面是一个示例代码&#xff0c;用于在运行完code1.py后紧接着运行code2…

论文配色方案(收藏)

方案一&#xff1a;复古 系列色——十六进制颜色码&#xff1a; 0780cf - 765005 - fa6d1d - 0e2c82 - b6b51f - da1f18 - 701866 - f47a75 - 009db2 - 024b51 - 0780cf - 765005 系列色——RGB颜色值&#xff1a; &#xff08;7,128,207&#xff09;-&#xff08;118,80,5&…

【记录】优化油猴插件【BD网盘播放器】

收获最重要前言优化代码收获1.禁止浏览器弹窗2.定时器3.设置属性-隐藏元素4.鼠标悬停和移开事件5.添加元素6.div里均匀分布7.获取元素属性值8.监听播放器状态9.jQuery 选择器前言 有钱的可以支持一下原作者&#xff0c;没钱就要多学习 优化 1.1 视频刚开始未播放时&#xff…

酷雷曼一站式图片直播,助力品牌高效传播

传统模式下&#xff0c;摄影师拍摄会议、活动现场的照片后&#xff0c;一般需要7-10天时间才能完成成片交付&#xff0c;而实际上&#xff0c;由于新闻宣传的即时性&#xff0c;照片延迟交付&#xff0c;远远不能满足客户的需求。因此&#xff0c;即时图片直播技术应运而生&…

Jenkins自动化部署实例讲解

文章目录 前言实例讲解基本环境全局工具配置创建任务任务配置源码管理构建步骤&#xff08;Build Steps&#xff09;第一步&#xff1a;调用Maven第二步&#xff1a;执行shell启动容器 后记 前言 你平常在做自己的项目时&#xff0c;是否有过部署项目太麻烦的想法&#xff1f;…

哈希应用——位图(bitset)

目录 见见猪跑(初步了解位图) 位图的模拟实现 位图的应用 1、给定100亿个整数&#xff0c;设计算法找到只出现一次的整数 2、给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 3、位图应用变形&#xff…

第六章 Gated RNN

目录6.1 RNN的问题6.1.1 RNN的复习6.1.2 梯度消失和梯度爆炸6.1.3 梯度消失和梯度爆炸的原因6.1.4 梯度爆炸的对策6.2 梯度消失和LSTM6.2.1 LSTM的接口6.2.2 LSTM层的结构6.2.3 输出门6.2.4 遗忘门6.2.5 新的记忆单元6.2.6 输入门6.2.7 LSTM的梯度的流动6.3 LSTM的实现6.4 使用…

CIO成就计划第二季第一期 | 活动回顾:基于数字技术重塑流程,驱动业务增长

2023年3月25日&#xff0c;《科创人》联手金蝶共同打造的【CIO成就计划第二季】首期培训在北京金蝶软件园圆满举行。 【CIO成就计划】第二季&#xff0c;坚持服务于企业CIO、数字化变革负责人的价值定位&#xff0c;通过三期线下闭门培训会社群交流&#xff0c;帮助CIO建立应对…

JUC高级十-AbstractQueuedSynchronizer之AQS

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …

【Java 并发编程】一文读懂线程、协程、守护线程

一文读懂线程、协程、守护线程1. 线程的调度1.1 协同式线程调度1.2 抢占式线程调度1.3 设置线程的优先级2. 线程的实现模型和协程2.1 内核线程实现2.2 用户线程实现2.3 混合实现2.4 Java 线程的实现2.5 协程2.5.1 出现的原因2.5.2 什么是协程2.5.3 Java19 虚拟线程 - 协程的复苏…