對于dagger2 ,相信很多童鞋都聽說過,因?yàn)橹髁骺蚣? RxJava + retrofit +dagger2? 應(yīng)用起來很6.我現(xiàn)在簡單記錄下我對dagger2的理解,也給對dagger2有點(diǎn)陌生的的提供一些簡單的資料.
首先需要了解幾個注解標(biāo)識? @Inject? @module? @Component? @provide? ? 都是用來干甚么的,還是哪代碼來講吧,只憑文字,怕是大家有點(diǎn)難以理解 ,首先先說 @ Inject? 這個注解是用來標(biāo)識需要注入的目標(biāo)對象,形象通俗點(diǎn)講,把我們想要的結(jié)果比喻成一盤紅燒肉的話,需要各種材料,和各種器具,是不是有點(diǎn)懵了.別著急,我慢慢給你解釋
上代碼? 這里我就直接拷代碼了
@Inject
class Activity : BaseActivity(){
@Inject lateinit var mPresenter : ActivityPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResouse())
}
}
通過成員變量注入到目標(biāo)類 當(dāng)然場景就是這里其實(shí)就是activity? ?我們可以把a(bǔ)ctivity當(dāng)成一口鍋,
@Inject是Dagger2內(nèi)置的一個注解;
@Inject用來標(biāo)注目標(biāo)對象(如上面的mPresenter);
@Inject用來標(biāo)注依賴類的構(gòu)造方法(如下面的ActivityPresenter);
class?ActivityPresenter@Inject?constructor()?{
?fun doSomething():String{?return?"This is result"?}?
}
可以看到我們定義的MainPresenter 類的構(gòu)造函數(shù)前面加了一個@Inject注解(由于有注解出現(xiàn),顯示無參構(gòu)造器constructor),同時定義了一個方法doSomething,返回一個字符串。
ActivityPresenter有了@Inject 標(biāo)注的構(gòu)造函數(shù)就表明,ActivityPresenter這個類是可以通過dagge2被動實(shí)例化的!
接下來@module??
這個注解的存在就是因?yàn)橛幸恍┑谌降念?你是無法加上@inject注解的,比如Gosn,所以可以通過@module來表明你要什么材料,比如蔥姜蒜, 會由這個類提供給你 ,上代碼,
@Module
class ActivityModule() {
@Provides? ?
fun provideGson() = GsonBuilder().create()
}
這里的@module 還有一個用法,就是一個module,可以包括另一個module,是不是很刺激,也就是說,我這邊只有蔥姜蒜,而另一個module那里有醬油,料酒等,可以直接把一個@Module類作為了另一個@Module類的組成部分
代碼
@Module(includes = arrayOf(AppModule::class))
class ActivityModule() {
@Provides? ?
fun provideGson() = GsonBuilder().create()
}
這樣,你這個ActivityModule里面蔥姜蒜,醬油,料酒就都有了,是不是很6?
@Provides
那上面代碼里也出現(xiàn)了??@Provides? ?顧名思義 就是我需要提供的類的實(shí)例用@Provides標(biāo)識之后,dagger2會根據(jù)這個注解去給你拿這個實(shí)例這個很好理解,pass
@Component
首先必須強(qiáng)調(diào)被@Component注解的必須是接口 或者抽象類,
好,下面關(guān)鍵的來了,我們東西都準(zhǔn)備齊了,但是給誰用呢,這個是比較關(guān)心的!先上代碼,
@Component
@Component(modules = arrayOf(ActivityModule::class))
interface ActivityComponent {
fun inJect(activity: Activity)
}
首先如果我們要注解的是自己的類,不去要module提供,直接@Component注解就可以了,如果有一些第三方需要module提供的,那就得@Component(modules = arrayOf(ActivityModule::class))指定需要提供材料的module? ,其實(shí)@Component就是一個注射器,它的作用就是指定我們這些東西要注入到哪里去,也就是我說的那么多材料放在那里,當(dāng)然炒菜肯定放在鍋里了 ,我在這把Activity比喻成鍋了,,哈哈,恩,就這樣吧,,
fun inJect(activity: Activity)這個inject方法就是指定把蔥姜蒜這些調(diào)料放到哪個鍋里,??
然后重新編譯一下(重點(diǎn),編譯,編譯),不重新編譯dagger2是不會理你的
編譯后會生成一個以“Dagger”開頭的Component文件,如DaggerMainComponent,接下來咱們使用一下:
class Activity : BaseActivity(){
????@Inject lateinit var mPresenter : ActivityPresenter
????override fun onCreate(savedInstanceState: Bundle?) {
????super.onCreate(savedInstanceState)
????setContentView(getLayoutResouse())
????????????initInjection()
????}
????/* Dagger2注入注冊 */
?????private?fun initInjection()?{
?????????DaggerActivityComponent.builder().build().inject(this)
?????}
}
要想起作用,需要調(diào)用DaggerMainComponent的inject方法進(jìn)行“注冊”。這個動作可以理解把做菜的材料放到鍋里,材料都齊了,剩下的做的好壞就看你的手藝了!
驗(yàn)證是否注入成功可以通過打日志來看mPresenter是否被實(shí)例化,
本文寫的有點(diǎn)粗糙,如果有問題的話歡迎指正,重要的希望大家能理解,其實(shí)dagger2還有其他的注解表示符,我們以后再說! bye