對于dagger2 ,相信很多童鞋都聽說過,因為主流框架? RxJava + retrofit +dagger2? 應用起來很6.我現(xiàn)在簡單記錄下我對dagger2的理解,也給對dagger2有點陌生的的提供一些簡單的資料.
首先需要了解幾個注解標識? @Inject? @module? @Component? @provide? ? 都是用來干甚么的,還是哪代碼來講吧,只憑文字,怕是大家有點難以理解 ,首先先說 @ Inject? 這個注解是用來標識需要注入的目標對象,形象通俗點講,把我們想要的結(jié)果比喻成一盤紅燒肉的話,需要各種材料,和各種器具,是不是有點懵了.別著急,我慢慢給你解釋
上代碼? 這里我就直接拷代碼了
@Inject
class Activity : BaseActivity(){
@Inject lateinit var mPresenter : ActivityPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResouse())
}
}
通過成員變量注入到目標類 當然場景就是這里其實就是activity? ?我們可以把activity當成一口鍋,
@Inject是Dagger2內(nèi)置的一個注解霸株;
@Inject用來標注目標對象(如上面的mPresenter)刚照;
@Inject用來標注依賴類的構(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 標注的構(gòu)造函數(shù)就表明,ActivityPresenter這個類是可以通過dagge2被動實例化的!
接下來@module??
這個注解的存在就是因為有一些第三方的類,你是無法加上@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? ?顧名思義 就是我需要提供的類的實例用@Provides標識之后,dagger2會根據(jù)這個注解去給你拿這個實例這個很好理解,pass
@Component
首先必須強調(diào)被@Component注解的必須是接口 或者抽象類,
好,下面關(guān)鍵的來了,我們東西都準備齊了,但是給誰用呢,這個是比較關(guān)心的!先上代碼,
@Component
@Component(modules = arrayOf(ActivityModule::class))
interface ActivityComponent {
fun inJect(activity: Activity)
}
首先如果我們要注解的是自己的類,不去要module提供,直接@Component注解就可以了,如果有一些第三方需要module提供的,那就得@Component(modules = arrayOf(ActivityModule::class))指定需要提供材料的module? ,其實@Component就是一個注射器,它的作用就是指定我們這些東西要注入到哪里去,也就是我說的那么多材料放在那里,當然炒菜肯定放在鍋里了 ,我在這把Activity比喻成鍋了,,哈哈,恩,就這樣吧,,
fun inJect(activity: Activity)這個inject方法就是指定把蔥姜蒜這些調(diào)料放到哪個鍋里,??
然后重新編譯一下(重點,編譯,編譯),不重新編譯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方法進行“注冊”。這個動作可以理解把做菜的材料放到鍋里,材料都齊了,剩下的做的好壞就看你的手藝了!
驗證是否注入成功可以通過打日志來看mPresenter是否被實例化,
本文寫的有點粗糙,如果有問題的話歡迎指正,重要的希望大家能理解,其實dagger2還有其他的注解表示符,我們以后再說! bye