国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Spring 6 正式“拋棄” Feign

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,真實(shí)面經(jīng),簡歷模版,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

近期,Spring 6 的第一個(gè) GA 版本發(fā)布了,其中帶來了一個(gè)新的特性——HTTP Interface。這個(gè)新特性,可以讓開發(fā)者將 HTTP 服務(wù),定義成一個(gè)包含特定注解標(biāo)記的方法的 Java 接口,然后通過對(duì)接口方法的調(diào)用,完成 HTTP 請(qǐng)求??雌饋砗芟袷褂?Feign 來完成遠(yuǎn)程服務(wù)調(diào)用,這可能是 Spring “拋棄” feign 等 http 調(diào)用的一種趨勢(shì),Spring 要規(guī)范和簡化這一塊的實(shí)現(xiàn)了,讓開發(fā)者更關(guān)注聚集于業(yè)務(wù)。下面我們參考官方文檔來完成一個(gè) Demo。

完成一個(gè) Demo

首先創(chuàng)建一個(gè)簡單的 HTTP 服務(wù),這一步可以創(chuàng)建一個(gè)簡單的 Spring Boot 工程來完成。

先創(chuàng)建一個(gè)實(shí)體類:

public class User implements Serializable {     private int id;     private String name;     // 省略構(gòu)造方法、Getter和Setter     @Override     public String toString() {         return id + ":" + name;     } }

再寫一個(gè)簡單的 Controller:

@GetMapping("/users") public List   list() {     return IntStream.rangeClosed(1, 10)             .mapToObj(i -> new User(i, "User" + i))             .collect(Collectors.toList()); }

確保啟動(dòng)服務(wù)之后,能夠從http://localhost:8080/users地址獲取到一個(gè)包含十個(gè)用戶信息的用戶列表。

下面我們新建一個(gè) 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 依賴,原因下文中會(huì)提到。

創(chuàng)建好新的 Spring Boot 工程后,首先需要定義一個(gè) HTTP Interface 接口。最簡單的定義如下即可:

public interface UserApiService {     @GetExchange("/users")     List   getUsers(); }

然后,我們可以寫一個(gè)測試方法。

@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 users = service.getUsers();    for (User user : users) {       System.out.println(user);    } }

最終回打印獲取到的是個(gè)用戶信息:

1:User1 2:User2 ... 9:User9 10:User10

以上是一個(gè)最簡單的示例,下面我們看看其中的一些細(xì)節(jié)。

GetExchange(HttpExchange)注解

上文例子中的 GetExchange 注解代表這個(gè)方法代替執(zhí)行一個(gè) HTTP Get 請(qǐng)求,與此對(duì)應(yīng),Spring 還包含了其他類似的注解:

這些注解定義在spring-web模塊的org.springframework.web.service.annotation包下,除了 HttpExchange 之外,其他的幾個(gè)都是 HttpExchange 的特殊形式,這一點(diǎn)與 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 {}; }

在上面的例子中,我們只指定了請(qǐng)求的資源路徑。

UserApiService 實(shí)例的創(chuàng)建

在上面例子中,我們定義的 HTTP Interface 接口是 UserApiService,在測試方法中,我們通過 HttpServiceProxyFactory 創(chuàng)建了 UserApiService 的實(shí)例,這是參考了 Spring 的官方文檔的寫法。

你也可以將創(chuàng)建的過程寫到一個(gè) @Bean 方法中,從而可以將創(chuàng)建好的實(shí)例注入到其他的組件中。

我們?cè)俣x UserApiService 的時(shí)候,只是聲明了一個(gè)接口,那具體的請(qǐng)求操作是怎么發(fā)出的呢,我們可以通過 DEBUG 模式看得出來,這里創(chuàng)建的 UserApiService 的實(shí)例,是一個(gè)代理對(duì)象:

目前,Spring 還沒有提供更方便的方式來創(chuàng)建這些代理對(duì)象,不過,之后的版本肯定會(huì)提供,如果你感興趣的話,可以從 HttpServiceProxyFactory 的createClient方法的源碼中看到一些與創(chuàng)建 AOP 代理相似的代碼,因此,我推測 Spring 之后可能會(huì)增加類似的注解來方便地創(chuàng)建代理對(duì)象。

其他特性

除了上述例子中的簡單使用之外,添加了 HttpExchange 的方法還支持各種類型的參數(shù),這一點(diǎn)也與 Spring MVC 的 Controller 方法類似,方法的返回值也可以是任意自定義的實(shí)體類型(就像上面的例子一樣),此外,還支持自定義的異常處理。

為什么需要 Spring Reactive Web 的依賴

上文中創(chuàng)建工程的時(shí)候,引入了 Spring Reactive Web 的依賴,在創(chuàng)建代理的service對(duì)象的時(shí)候,使用了其中的 WebClient 類型。這是因?yàn)椋琀TTP Interface 目前只內(nèi)置了 WebClient 的實(shí)現(xiàn),它屬于 Reactive Web 的范疇。Spring 在會(huì)在后續(xù)版本中推出基于 RestTemplate 的實(shí)現(xiàn)。

總結(jié)

本文帶你對(duì) HTTP Interface 特性進(jìn)行了簡單的了解,我之后會(huì)深入研究這個(gè)特性,也會(huì)追蹤后續(xù)版本中的改進(jìn)并與你分享,歡迎點(diǎn)贊加關(guān)注。

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

公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!

最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
尤爾曼德:我們?cè)诼?lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

尤爾曼德:我們?cè)诼?lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

懂球帝
2026-01-29 16:24:06
清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

博士觀察
2026-01-28 20:46:56
商業(yè)航天概念震蕩拉升 航天科技直線漲停

商業(yè)航天概念震蕩拉升 航天科技直線漲停

每日經(jīng)濟(jì)新聞
2026-01-29 11:06:08
被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

靜若梨花
2026-01-29 16:25:55
“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

妍妍教育日記
2026-01-27 19:58:28
隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

凌空倒鉤
2026-01-29 07:56:44
15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

歲月有情1314
2026-01-29 13:47:16
把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

毒sir財(cái)經(jīng)
2026-01-28 15:27:05
退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

掠影后有感
2026-01-29 10:44:30
這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

百態(tài)人間
2026-01-27 15:31:38
他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

長風(fēng)文史
2026-01-29 14:46:17
還八百就八百,你可知八百精兵意味著什么?

還八百就八百,你可知八百精兵意味著什么?

小豫講故事
2026-01-28 06:00:07
開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

社會(huì)醬
2026-01-16 16:54:49
特朗普:她不會(huì)辭職;我可能面臨被彈劾

特朗普:她不會(huì)辭職;我可能面臨被彈劾

揚(yáng)子晚報(bào)
2026-01-28 07:23:00
凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

大風(fēng)新聞
2026-01-28 19:04:04
自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對(duì)了3件事

自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對(duì)了3件事

君笙的拂兮
2026-01-28 16:47:18
俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來吧,保證你的安全

俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來吧,保證你的安全

娛樂督察中
2026-01-29 16:00:30
價(jià)格大跳水!主力車型直降超15萬,中年男人的夢(mèng)中豪車撐不住了?

價(jià)格大跳水!主力車型直降超15萬,中年男人的夢(mèng)中豪車撐不住了?

財(cái)經(jīng)八卦
2026-01-28 20:05:03
國鐵集團(tuán):12306客戶端沒與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購票

國鐵集團(tuán):12306客戶端沒與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購票

紅星新聞
2026-01-29 11:19:02
腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

荷蘭豆愛健康
2026-01-29 13:04:32
2026-01-29 17:16:49
Java精選
Java精選
一場永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹:中國汽車未來年銷或達(dá)5000萬輛

汽車要聞

車長超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

親子
房產(chǎn)
手機(jī)
藝術(shù)
公開課

親子要聞

一個(gè)現(xiàn)象:縣城里的孕婦越來越少了

房產(chǎn)要聞

萬科難眠夜:前董事長郁亮失聯(lián),三筆債券靠深鐵才通過展期

手機(jī)要聞

游戲直播神器!iQOO 15 Ultra支持一鍵投屏 開播0門檻

藝術(shù)要聞

梵高全集(高清350張)震撼……

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版