Jetpack-Hilt總結(jié)

1、使用前提:

必須自定義一個(gè)Application,并加上@HiltAndroidApp注解,否則Hilt無(wú)法正常工作

2、選擇指定依賴注入的入口:

為什么用選擇,是因?yàn)榭梢员蛔⑷氲娜肟谝呀?jīng)被限制死了,一共6個(gè):


依賴入口.png

想在哪個(gè)組件里進(jìn)行依賴注入,就在頭上加對(duì)應(yīng)注解。

3、簡(jiǎn)單依賴注入:---@Inject

3.1、依賴注入類的生成:

在需要變成可注入類class X的構(gòu)造函數(shù)前加上@Inject注解即可。

3.2、注入:

在入口類中,申明X類型的變量x,并給其添加@Inject注解即可。

4、復(fù)雜依賴注入:

4.1、帶參數(shù)的依賴注入:

class X @Inject constructor(val y:Y)

此時(shí)只要對(duì)Y的構(gòu)造函數(shù)加@Inject注解讓其變成可注入類即可,如果Y的構(gòu)造函數(shù)也有參數(shù),以此類推。

4.2、接口的依賴注入:---工廠模塊+@Qualifier+@Binds

接口:interface X    。接口實(shí)現(xiàn)類:  class XImpl1    /  class XImpl2
4.2.1、單實(shí)現(xiàn)類:對(duì)接口的實(shí)現(xiàn)類進(jìn)行簡(jiǎn)單依賴注入即可。
4.2.2、多實(shí)現(xiàn)類(同樣適用一個(gè)類對(duì)應(yīng)多個(gè)子類型):需要自定義一個(gè)提供實(shí)現(xiàn)類的“工廠模塊”:

步驟:

  1. 創(chuàng)建一個(gè)“工廠模板”類,并提供兩個(gè)方法,入?yún)⑹荴的不同實(shí)現(xiàn)類,返回接口是X
class XModule{
 fun providerXimpl1(x1:XImpl1):X

   fun providerXimpl2(x2:XImpl2):X
}
  1. 給模板類加上2個(gè)注解:
    @Module // 這個(gè)好理解,表示模塊
    @InstallIn(ActivityComponent::class) //這個(gè)也是字面意思,安裝到xxxx中,第5部分詳細(xì)說(shuō)

  2. 對(duì)每一個(gè)實(shí)現(xiàn)類型創(chuàng)建其特有注解,用@Qualifier,表示修飾:

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotationn class BindXImpl1

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotationn class BindXImpl2
  1. 最后給模板類中的方法加上2個(gè)注解:
    @第三步自定義的注解
    @Binds // 表示用于獲取依賴注入真正的接口實(shí)現(xiàn)類型

最后完整的樣子:

@Module 
@InstallIn(ActivityComponent::class)class XModule{

    @BindXImpl1
    @Binds
     fun providerXimpl1(x1:XImpl1):X
    
    @BindXImpl2
    @Binds
    fun providerXimpl2(x2:XImpl2):X
}
  1. 在使用的地方,不僅保留@Inject,也要同步加上自定義的注解:
@BindXImpl1
@Inject
latainit var x1:X

4.3、第三方提供的類的依賴注入 ---工廠模塊+@Provides

解決方案和4.2用@Module類似,有一點(diǎn)小區(qū)別
相同的是還是創(chuàng)建一個(gè)模板類,加上2個(gè)注解,@Module@InstallIn(ActivityComponent::class),提供一個(gè)方法,返回類型就是第三方的類型;
不同的是方法上的注解不用@Binds了,并且也不用自定義注解了,而是用@Provides

5、InstallIn作用域以及和依賴注入入口的區(qū)別

InstallIn這個(gè)注解表示的是可注入類X能被注入的范圍,即X的作用域,比如@InstallIn(ActivityComponent::class),表示這個(gè)可注入類實(shí)例只能在Activity和activity所包含的Fragment/View中使用,其他地方不能用,比如service中不能用,用了就報(bào)錯(cuò),并且[圖片上傳中...(image.png-324eb7-1621056572551-0)]
同一個(gè)作用域下面共享的是同一個(gè)注入實(shí)例
與依賴入口的
區(qū)別其實(shí)就相當(dāng)于化學(xué)課中的玻璃瓶和濃硫酸,玻璃瓶就是入口,表示提供了存放濃硫酸(依賴注入)的能力,至于你放不不放濃硫酸,你愛放不放,放別的也可以,但是濃硫酸要求只能放在玻璃瓶(作用域)里,別的材料的瓶子不能存放,放了就腐蝕給你看。
InstallIn括號(hào)中可用的
值**是有限制的,有下面7個(gè)值:

7個(gè)組件對(duì)應(yīng)不同的作用域如上表,但是作用域之間的關(guān)系不是完全的互斥,而是某些作用域之間存在包含關(guān)系,如下圖:

比如@Singleton注解的箭頭可以指向所有地方。而@ServiceScoped注解的箭頭無(wú)處可指,所以只能限定在Service自身當(dāng)中使用。@ActivityScoped注解的箭頭可以指向Fragment、View當(dāng)中。

6、安卓?jī)?nèi)部預(yù)設(shè)的Qualifier

1、Context的預(yù)設(shè):

安卓中最常用的Context,實(shí)例都是安卓系統(tǒng)去創(chuàng)建的,開發(fā)者也沒有權(quán)限去修改其代碼的構(gòu)造函數(shù),但是也是可以注入的,并且不用自己寫@Module提供工廠模板,安卓已經(jīng)提供了類似的預(yù)設(shè)Qualifier,比如context對(duì)應(yīng)的Qualifier為:@ApplicationContext@ActivityContext等,入?yún)⑹莄ontext的地方參數(shù)前加上這個(gè)注解即可,當(dāng)然,具體用哪個(gè)要結(jié)合注解作用域,比如@SingleTon的話就需要用ApplicationContext,而不能用ActivityContext。

2、Application和Activity的預(yù)設(shè):

不用添加任何注解,Hilt默認(rèn)就能自動(dòng)識(shí)別。注意,只能是這兩個(gè)類型,這兩個(gè)類型的子類型還是要用@Provides工廠模板+向下轉(zhuǎn)型的方式提供一下的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容