中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Google 開源的依賴注入庫,比 Spring 更小更快!

發布時間:2020-06-13 15:58:31 來源:網絡 閱讀:238 作者:wx5d30212829a35 欄目:編程語言

Google開源的一個依賴注入類庫Guice,相比于Spring IoC來說更小更快。

Elasticsearch大量使用了Guice,本文簡單的介紹下Guice的基本概念和使用方式。
學習目標

  • 概述:了解Guice是什么,有什么特點;

  • 快速開始:通過實例了解Guice;

  • 核心概念:了解Guice涉及的核心概念,如綁定(Binding)、范圍(Scope)和注入(Injection);

  • 最佳實踐:官方推薦的最佳實踐;

Guice概述

  • Guice是Google開源的依賴注入類庫,通過Guice減少了對工廠方法和new的使用,使得代碼更易交付、測試和重用;

  • Guice可以幫助我們更好地設計API,它是個輕量級非侵入式的類庫;

  • Guice對開發友好,當有異常發生時能提供更多有用的信息用于分析;

快速開始

假設一個在線預訂Pizza的網站,其有一個計費服務接口:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

使用new的方式獲取信用卡支付處理器和數據庫交易日志記錄器:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

使用new的問題是使得代碼耦合,不易維護和測試。比如在UT里不可能直接用真實的信用卡支付,需要Mock一個CreditCardProcessor。

相比于new,更容易想到的改進是使用工廠方法,但是工廠方法在測試中仍存在問題(因為通常使用全局變量來保存實例,如果在用例中未重置可能會影響其他用例)。

更好的方式是通過構造方法注入依賴:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

對于真實的網站應用可以注入真正的業務處理服務類:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

中可以注入Mock類:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

那通過Guice怎么實現依賴注入呢?首先我們需要告訴Guice如果找到接口對應的實現類,這個可以通過模塊來實現:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

這里的模塊只需要實現Module接口或繼承自AbstractModule,然后在configure方法中設置綁定(后面會繼續介紹)即可。Spring Boot 構造器參數綁定,這篇推薦大家看下。

然后只需在原有的構造方法中增加@Inject注解即可注入

Google 開源的依賴注入庫,比 Spring 更小更快!

?

最后,再看看main方法中是如何調用的:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

綁定

連接綁定

連接綁定是最常用的綁定方式,它將一個類型和它的實現進行映射。下面的例子中將TransactionLog接口映射到它的實現類DatabaseTransactionLog。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

連接綁定還支持鏈式,比如下面的例子最終將TransactionLog接口映射到實現類MySqlDatabaseTransactionLog。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

注解綁定

通過一個類型可能存在多個實現,比如在信用卡支付處理器中存在PayPal的支付和Google支付,這樣通過連接綁定就搞不定。Spring Boot 最核心的 25 個注解,推薦大家看下。關注微信公眾號:Java技術棧,在后臺回復:spring,可以獲取我整理的 N 篇最新?Spring?系列技術教程,都是干貨。

這時我們可以通過注解綁定來實現:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

可以看到在模塊的綁定時用annotatedWith方法指定具體的注解來進行綁定,這種方式有一個問題就是我們必須增加自定義的注解來綁定,基于此Guice內置了一個@Named注解滿足該場景:

Google 開源的依賴注入庫,比 Spring 更小更快!

?

實例綁定

將一個類型綁定到一個具體的實例而非實現類,這個通過是在無依賴的對象(比如值對象)中使用。如果toInstance包含復雜的邏輯會導致啟動速度,此時應該通過@Provides方法綁定。

bind(String.class).annotatedWith(Names.named("JDBCURL")).toInstance("jdbc:mysql://localhost/pizza";
bind(Integer.class).annotatedWith(Names.named("login timeout seconds")).toInstance(10);

@Provides方法綁定

模塊中定義的、帶有@Provides注解的、方法返回值即為綁定映射的類型。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

Provider綁定

如果使用@Provides方法綁定邏輯越來越復雜時就可以通過Provider綁定(一個實現了Provider接口的實現類)來實現。Google 開源的依賴注入庫,比 Spring 更小更快!

?

無目標綁定

當我們想提供對一個具體的類給注入器時就可以采用無目標綁定。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

構造器綁定

3.0新增的綁定,適用于第三方提供的類或者是有多個構造器參與依賴注入。通過@Provides方法可以顯式調用構造器,但是這種方式有一個限制:無法給這些實例應用AOP。Spring Boot 構造器參數綁定,推薦大家看下吧。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

范圍

默認情況下,Guice每次都會返回一個新的實例,這個可以通過范圍(Scope)來配置。常見的范圍有單例(@Singleton)、會話(@SessionScoped)和請求(@RequestScoped),另外還可以通過自定義的范圍來擴展。12 種 Spring 常用注解,推薦大家看下。

范圍的注解可以應該在實現類、@Provides方法中,或在綁定的時候指定(優先級最高):

Google 開源的依賴注入庫,比 Spring 更小更快!

?

另外,Guice還有一種特殊的單例模式叫饑餓單例(相對于懶加載單例來說):

Google 開源的依賴注入庫,比 Spring 更小更快!

?

注入

依賴注入的要求就是將行為和依賴分離,它建議將依賴注入而非通過工廠類的方法去查找。注入的方式通常有構造器注入、方法注入、屬性注入等。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

Google 開源的依賴注入庫,比 Spring 更小更快!

?

輔助注入

輔助注入(Assisted Inject)屬于Guice擴展的一部分,它通過@Assisted注解自動生成工廠來加強非注入參數的使用。

Google 開源的依賴注入庫,比 Spring 更小更快!

?

Google 開源的依賴注入庫,比 Spring 更小更快!

?

最佳實踐

  • 最小化可變性:盡可能注入的是不可變對象;

  • 只注入直接依賴:不用注入一個實例來獲取真正需要的實例,增加復雜性且不易測試;

  • 避免循環依賴

  • 避免靜態狀態:靜態狀態和可測試性就是天敵;

  • 采用@Nullable:Guice默認情況下禁止注入null對象;

  • 模塊的處理必須要快并且無副作用

  • 在Providers綁定中當心IO問題:因為Provider不檢查異常、不支持超時、不支持重試;

  • 不用在模塊中處理分支邏輯

  • 盡可能不要暴露構造器


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河津市| 长汀县| 利辛县| 确山县| 盐池县| 平凉市| 西乌| 威信县| 定州市| 巴塘县| 永年县| 邯郸市| 山丹县| 开阳县| 罗平县| 万荣县| 昭平县| 龙陵县| 朝阳市| 翁牛特旗| 武冈市| 丘北县| 诸城市| 巴东县| 客服| 赣榆县| 建德市| 津南区| 金华市| 南平市| 鄂托克旗| 阿荣旗| 榆树市| 阿克苏市| 巧家县| 泉州市| 星子县| 新乡市| 常山县| 抚顺市| 马公市|