Google開源的依賴注入庫,比Spring更小更快!-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)-企業(yè)級(jí)云服務(wù)器提供商,為用戶提供云服務(wù)器、CDN、云安全服務(wù)、服務(wù)器托管、服務(wù)器租用、高防主機(jī)等全方位云服務(wù)與各行業(yè)解決方案,幫助企業(yè)及個(gè)人極速備案,輕松上云,安全無憂。

Elasticsearch大量使用了Guice,本文簡(jiǎn)單的介紹下Guice的基本概念和使用方式。
學(xué)習(xí)目標(biāo)

  • 概述:了解Guice是什么,有什么特點(diǎn);

  • 快速開始:通過實(shí)例了解Guice;

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

  • 最佳實(shí)踐:官方推薦的最佳實(shí)踐;

Guice概述

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

  • Guice可以幫助我們更好地設(shè)計(jì)API,它是個(gè)輕量級(jí)非侵入式的類庫;

  • Guice對(duì)開發(fā)友好,當(dāng)有異常發(fā)生時(shí)能提供更多有用的信息用于分析;

快速開始

假設(shè)一個(gè)在線預(yù)訂Pizza的網(wǎng)站,其有一個(gè)計(jì)費(fèi)服務(wù)接口:

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

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

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

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

相比于new,更容易想到的改進(jìn)是使用工廠方法,但是工廠方法在測(cè)試中仍存在問題(因?yàn)橥ǔJ褂萌肿兞縼肀4鎸?shí)例,如果在用例中未重置可能會(huì)影響其他用例)。

更好的方式是通過構(gòu)造方法注入依賴:

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

對(duì)于真實(shí)的網(wǎng)站應(yīng)用可以注入真正的業(yè)務(wù)處理服務(wù)類:

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

中可以注入Mock類:

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

那通過Guice怎么實(shí)現(xiàn)依賴注入呢?首先我們需要告訴Guice如果找到接口對(duì)應(yīng)的實(shí)現(xiàn)類,這個(gè)可以通過模塊來實(shí)現(xiàn):

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

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

然后只需在原有的構(gòu)造方法中增加@Inject注解即可注入:

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

最后,再看看main方法中是如何調(diào)用的:

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

綁定

連接綁定

連接綁定是最常用的綁定方式,它將一個(gè)類型和它的實(shí)現(xiàn)進(jìn)行映射。下面的例子中將TransactionLog接口映射到它的實(shí)現(xiàn)類DatabaseTransactionLog。

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

連接綁定還支持鏈?zhǔn)剑热缦旅娴睦幼罱K將TransactionLog接口映射到實(shí)現(xiàn)類MySqlDatabaseTransactionLog。

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

注解綁定

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

這時(shí)我們可以通過注解綁定來實(shí)現(xiàn):

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

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

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

實(shí)例綁定

將一個(gè)類型綁定到一個(gè)具體的實(shí)例而非實(shí)現(xiàn)類,這個(gè)通過是在無依賴的對(duì)象(比如值對(duì)象)中使用。如果toInstance包含復(fù)雜的邏輯會(huì)導(dǎo)致啟動(dòng)速度,此時(shí)應(yīng)該通過@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方法綁定邏輯越來越復(fù)雜時(shí)就可以通過Provider綁定(一個(gè)實(shí)現(xiàn)了Provider接口的實(shí)現(xiàn)類)來實(shí)現(xiàn)。Google 開源的依賴注入庫,比 Spring 更小更快!

無目標(biāo)綁定

當(dāng)我們想提供對(duì)一個(gè)具體的類給注入器時(shí)就可以采用無目標(biāo)綁定。

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

構(gòu)造器綁定

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

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

范圍

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

范圍的注解可以應(yīng)該在實(shí)現(xiàn)類、@Provides方法中,或在綁定的時(shí)候指定(優(yōu)先級(jí)最高):

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

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

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

注入

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

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

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

輔助注入

輔助注入(Assisted Inject)屬于Guice擴(kuò)展的一部分,它通過@Assisted注解自動(dòng)生成工廠來加強(qiáng)非注入?yún)?shù)的使用。

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

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

最佳實(shí)踐

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

  • 只注入直接依賴:不用注入一個(gè)實(shí)例來獲取真正需要的實(shí)例,增加復(fù)雜性且不易測(cè)試;

  • 避免循環(huán)依賴

  • 避免靜態(tài)狀態(tài):靜態(tài)狀態(tài)和可測(cè)試性就是天敵;

  • 采用@Nullable:Guice默認(rèn)情況下禁止注入null對(duì)象;

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

  • 在Providers綁定中當(dāng)心IO問題:因?yàn)镻rovider不檢查異常、不支持超時(shí)、不支持重試;

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

  • 盡可能不要暴露構(gòu)造器

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

文章名稱:Google開源的依賴注入庫,比Spring更小更快!-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.muchs.cn/article12/epsdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)