這篇文章主要介紹了andriod的Dagger怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇andriod的Dagger怎么用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為范縣企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,范縣網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
剛開(kāi)始學(xué)習(xí)軟件工程的時(shí)候,我們經(jīng)常會(huì)碰到像這樣的事情:
軟件應(yīng)該符合 SOLID 原則。
但這句話實(shí)際是什么意思?讓我們看看 SOLID 中每個(gè)字母在架構(gòu)里所代表的重要含義,例如:
S - 單職責(zé)原則
O - 開(kāi)閉原則
L - Liskov 替換原則
I - 接口分離原則
D - 依賴反轉(zhuǎn)原則 這也是依賴注入(dependency injection)的核心概念。
簡(jiǎn)單來(lái)說(shuō),我們需要提供一個(gè)類(lèi),這個(gè)類(lèi)有它所需要的所有對(duì)象,以便實(shí)現(xiàn)其功能。
概述
依賴注入聽(tīng)起來(lái)像是描述非常復(fù)雜的東西的一個(gè)術(shù)語(yǔ),但實(shí)際上它很簡(jiǎn)單,看下面這個(gè)例子你就明白了:
class NoDependencyInjection { private Dependency d; public NoDependencyInjection() { d = new Dependency(); } } class DependencyInjection { private Dependency d; public DependencyInjection(Dependency d) { this.d = d; } }
正如我們所見(jiàn),***種情況是我們?cè)跇?gòu)造器里創(chuàng)建了依賴對(duì)象,但在第二種情況下,它作為參數(shù)被傳遞給構(gòu)造器,這就是我們所說(shuō)的依賴注入(dependency injection)。這樣做是為了讓我們所寫(xiě)的類(lèi)不依靠特定依賴關(guān)系的實(shí)現(xiàn),卻能直接使用它。
參數(shù)傳遞的目標(biāo)是構(gòu)造器,我們就稱之為構(gòu)造器依賴注入;或者是某個(gè)方法,就稱之為方法依賴注入:
class Example { private ConstructorDependency cd; private MethodDependency md; Example(ConstructorDependency cd) { this.cd = cd; //Constructor Dependency Injection } public setMethodDependency(MethodDependency md) { this.md = md; //Method Dependency Injection } }
要是你想總體深入地了解依賴注入,可以看看由 Dan Lew 發(fā)表的精彩的演講,事實(shí)上是這個(gè)演講啟迪了這篇概述。
在 Android 平臺(tái),當(dāng)需要框架來(lái)處理依賴注入這個(gè)特殊的問(wèn)題時(shí),我們有不同的選擇,其中最有名的框架就是 Dagger 2。它最開(kāi)始是由 Square 公司(LCTT 譯注:Square 是美國(guó)一家移動(dòng)支付公司)的一些很棒的開(kāi)發(fā)者開(kāi)發(fā)出來(lái)的,然后慢慢發(fā)展成由 Google 自己開(kāi)發(fā)。首先開(kāi)發(fā)出來(lái)的是 Dagger 1,然后 Big G 接手這個(gè)項(xiàng)目發(fā)布了第二個(gè)版本,做了很多改動(dòng),比如以注解(annotation)為基礎(chǔ),在編譯的時(shí)候完成其任務(wù)。
導(dǎo)入框架
安裝 Dagger 并不難,但需要導(dǎo)入 android-apt 插件,通過(guò)向項(xiàng)目的根目錄下的 build.gradle 文件中添加它的依賴關(guān)系:
buildscript{ ... dependencies{ ... classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ } }
然后,我們需要將 android-apt 插件應(yīng)用到項(xiàng)目 build.gradle 文件,放在文件頂部 Android application 那一句的下一行:
apply plugin: ‘com.neenbedankt.android-apt’
這個(gè)時(shí)候,我們只用添加依賴關(guān)系,然后就能使用庫(kù)及其注解(annotation)了:
dependencies{ ... compile ‘com.google.dagger:dagger:2.6’ apt ‘com.google.dagger:dagger-compiler:2.6’ provided ‘javax.annotation:jsr250-api:1.0’ }
需要加上***一個(gè)依賴關(guān)系是因?yàn)?@Generated 注解在 Android 里還不可用,但它是原生的 Java 注解。
Dagger 模塊
要注入依賴,首先需要告訴框架我們能提供什么(比如說(shuō)上下文)以及特定的對(duì)象應(yīng)該怎樣創(chuàng)建。為了完成注入,我們用 @Module 注釋對(duì)一個(gè)特殊的類(lèi)進(jìn)行了注解(這樣 Dagger 就能識(shí)別它了),尋找 @Provide 注解的方法,生成圖表,能夠返回我們所請(qǐng)求的對(duì)象。
看下面的例子,這里我們創(chuàng)建了一個(gè)模塊,它會(huì)返回給我們 ConnectivityManager,所以我們要把 Context 對(duì)象傳給這個(gè)模塊的構(gòu)造器。
@Module public class ApplicationModule { private final Context context; public ApplicationModule(Context context) { this.context = context; } @Provides @Singleton public Context providesContext() { return context; } @Provides @Singleton public ConnectivityManager providesConnectivityManager(Context context) { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } }
Dagger 中十分有意思的一點(diǎn)是簡(jiǎn)單地注解一個(gè)方法來(lái)提供一個(gè)單例(Singleton),就能處理所有從 Java 中繼承過(guò)來(lái)的問(wèn)題。
組件
當(dāng)我們有一個(gè)模塊的時(shí)候,我們需要告訴 Dagger 想把依賴注入到哪里:我們?cè)谝粋€(gè)組件(Component)里完成依賴注入,這是一個(gè)我們特別創(chuàng)建的特殊注解接口。我們?cè)谶@個(gè)接口里創(chuàng)造不同的方法,而接口的參數(shù)是我們想注入依賴關(guān)系的類(lèi)。
下面給出一個(gè)例子并告訴 Dagger 我們想要 MainActivity 類(lèi)能夠接受 ConnectivityManager(或者在圖表里的其它依賴對(duì)象)。我們只要做類(lèi)似以下的事:
@Singleton @Component(modules = {ApplicationModule.class}) public interface ApplicationComponent { void inject(MainActivity activity); }
正如我們所見(jiàn),@Component 注解有幾個(gè)參數(shù),一個(gè)是所支持的模塊的數(shù)組,代表它能提供的依賴。這里既可以是 Context 也可以是 ConnectivityManager,因?yàn)樗鼈冊(cè)?ApplicationModule 類(lèi)中有聲明。
用法
這時(shí),我們要做的是盡快創(chuàng)建組件(比如在應(yīng)用的 onCreate 階段)并返回它,那么類(lèi)就能用它來(lái)注入依賴了:
為了讓框架自動(dòng)生成 DaggerApplicationComponent,我們需要構(gòu)建項(xiàng)目以便 Dagger 能夠掃描我們的代碼,并生成我們需要的部分。
在 MainActivity 里,我們要做的兩件事是用 @Inject 注解符對(duì)想要注入的屬性進(jìn)行注解,調(diào)用我們?cè)? ApplicationComponent 接口中聲明的方法(請(qǐng)注意后面一部分會(huì)因我們使用的注入類(lèi)型的不同而變化,但這里簡(jiǎn)單起見(jiàn)我們不去管它),然后依賴就被注入了,我們就能自由使用他們:
public class MainActivity extends AppCompatActivity { @Inject ConnectivityManager manager; @Override protected void onCreate(Bundle savedInstanceState) { ... ((App) getApplication()).getComponent().inject(this); } }
關(guān)于“andriod的Dagger怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“andriod的Dagger怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標(biāo)題名稱:andriod的Dagger怎么用
文章地址:http://redsoil1982.com.cn/article8/iigcip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、定制開(kāi)發(fā)、、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)