很顯然笆呆,Context并不能通過(guò)new的方式提供请琳,那么就通過(guò)構(gòu)造函數(shù)傳參的方式提供。詳細(xì)代碼如下:
可見(jiàn)必要的提供Context的
context()
的方法還是有的赠幕,而且用@Provides
注解俄精。至于這個(gè)ContextModule是什么時(shí)候被初始化的,通過(guò)什么樣的方式傳入到Dagger里面的榕堰,這個(gè)我們稍后再講竖慧。
那么通過(guò)這種注入方式,也可以提供Picasso逆屡。新建一個(gè)PicassoModule:
不難看出使用Dagger2會(huì)盡可能少的直接在需要依賴(lài)的地方new一個(gè)對(duì)象圾旨,而是通過(guò)Dagger去獲取一個(gè)對(duì)象。
那么會(huì)不會(huì)感到疑惑魏蔗,Dagger究竟是怎樣幫助我們生成所需要的類(lèi)呢砍的?通過(guò)點(diǎn)擊下圖中的紅色方框部分可以看到Dagger為我們生成的代碼。
生成的代碼如下:
可以看到Dagger生成了提供各個(gè)類(lèi)的Provider莺治,在
initialize()
中的初始化順序是按照正確的邏輯順序生成的廓鞠,雖然我們并沒(méi)有指定它的順序味混,這一切都是Dagger自動(dòng)完成的。為了使用Dagger為我們生成的類(lèi)诫惭,我們就必須創(chuàng)建GithubApplicationComponent的實(shí)例翁锡。代碼如下:
看到了嗎,含有context的Module就是通過(guò)這樣的方式被初始化夕土,并且傳入Dagger的馆衔。通過(guò)創(chuàng)建的component就可以獲取需要的githubService和picasso啦。但是大家有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題怨绣,這里面每個(gè)Module都需要new一個(gè)傳進(jìn)去角溃,假如有個(gè)50個(gè)Module,這工作量也不少啊篮撑,而且容易漏减细。事實(shí)上Dagger只需要傳入一個(gè)ContextModule就行了,其余的Module都會(huì)自動(dòng)幫你生成赢笨。就像下面這樣:
如果你會(huì)看上面Dagger幫我們生成的代碼時(shí)未蝌,里面
build()
方法,你就會(huì)發(fā)現(xiàn)茧妒,Dagger會(huì)檢查需要的類(lèi)萧吠,如果為空就幫我們生成所需要的類(lèi)。唯一一個(gè)一旦為空就拋出異常的的Module就是ContextModule桐筏,因?yàn)镈agger并不知道如何創(chuàng)建這個(gè)類(lèi)纸型。
怎么樣,再對(duì)比剛開(kāi)始Application中的類(lèi)梅忌,是不是感覺(jué)少了很多代碼狰腌。接下來(lái)的文章將會(huì)介紹Scope的使用。
相關(guān)文章:
從實(shí)例出發(fā)理解Dagger2(一)
從實(shí)例出發(fā)理解Dagger2(二)
從實(shí)例出發(fā)理解Dagger2(三)
從實(shí)例出發(fā)理解Dagger2(四)
從實(shí)例出發(fā)理解Dagger2(五)
從實(shí)例出發(fā)理解Dagger2(六)
從實(shí)例出發(fā)理解Dagger2(七)
參考資料:https://www.youtube.com/watch?v=gg1zxoVStBM&list=PLuR1PJnGR-Ih-HXnGSpnqjdhdvqcwhfFU&index=3