<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 前言 dagger2的大名我想大家都已經很熟了,它是解決Android或java中依賴注入的一個類庫(DI類庫)。當我看到一些開源的項目在使用dagger2時,我也有種匆匆欲動的感覺,因此就立馬想一探它的究竟,到底能給我帶來怎樣的好處。在學習使用dagger2的過程中,我遇到了以下的一些困惑: * dagger2中的Inject,Component,Module,Provides等等都是什么東東,有什么作用? * dagger2到底能帶來哪些好處? * 怎樣把dagger2應用到具體項目中? 在具體學習dagger2的時候,看了好多博客,看的時候感覺挺簡單的,但是在真正使用到項目中時候,腦袋就懵了,無從下手,Component應該怎么用,能放些什么方法? Module應該放些啥內容?Scope怎么起到作用域控制?.....各種疑問就橫空而出。所以**也許會有正在學習或即將要使用dagger2的同學在使用過程中遇到和我一樣的困惑**,因此我決定把我對dagger2的理解、使用經驗分享給大家,希望能對大家有幫助。 我會分幾節給講解dagger2。 ## 本節內容 Inject,Component,Module,Provides它們是什么?怎么去理解它們?各自有什么作用?主要從抽象的概念講解,不會涉及到具體代碼的剖析。 ## 提前科普知識點 在講解之前,我希望大家對以下知識點有所了解(知道的同學可以跳過) * **依賴注入(Dependency Injection簡稱DI)** * java中**注解(Annotation)** **依賴注入**:就是目標類(目標類需要進行依賴初始化的類,下面都會用目標類一詞來指代)中所依賴的**其他的類**的初始化過程,不是通過手動編碼的方式創建,而是通過**技術手段**可以把**其他的類的已經初始化好的實例**自動注入到目標類中。 ![](http://upload-images.jianshu.io/upload_images/1504173-d5f60535cc77f17d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) di.png 若您還是對**依賴注入**不了解,[點擊我可以讓您了解更多](http://baike.baidu.com/link?url=QB0xjWcya3HWr4p9VwZ6hxjcO-fybEbuLv6nBvHDbg99-HyLzstlGayZfIu4Swrw8QSyTmUdz3EVPRaOLdrGGyEXoasaIQra3wfojaX1RJgZ6Nl8mazfQrJYuwXA1G5TT9CM3cLqVdhLk-lG0Bo6SWo4wT-yaTv62_7GuOo-VcaGwpnohMlG0GIcnizbKVJQ) dagger2就是實現**依賴注入**的一種**技術手段**。 其次java注解的概念用法我們就不講了,dagger2中核心點就是java注解,[點擊我可以了解更多java注解知識](http://baike.baidu.com/link?url=aTMlLy_LOV3j6d9aszLbSOwUajGSL_CI1LagJ8bh--PxtOmrCI5vSwewTPCxLcVe07Q4BNoxqFX3TpsJ5B9yPq) ## 正式開始 以下的內容我會嘗試著去模仿**dagger2的作者是怎樣一步步完成dagger2這樣偉大的依賴注入類庫**的場景來講解(首先這個場景是我意淫的,大家勿噴,模仿該場景主要目的是為了能**由簡到難**一步步更深入的了解dagger2) ## Inject是什么鬼 先看一段代碼: ~~~ class A{ B b = new B(...); C c = new C(); D d = new D(new E()); F f = new F(.....); } ~~~ 上面的代碼完全沒任何問題,但是總感覺創建對象的這些代碼基本都是重復的體力勞動,那何嘗不想個辦法,把這些重復的體力勞動用一種自動化的、更省力的方法解決掉,這樣就可以讓開發的效率提高,可以把精力集中在重要的業務上了。 我們可以用**注解(Annotation)來標注目標類中所依賴的其他類,同樣用注解來標注所依賴的其他類的構造函數**,那注解的名字就叫Inject ~~~ class A{ @Inject B b; } class B{ @Inject B(){ } } ~~~ 這樣我們就可以讓目標類中所依賴的其他類與其他類的構造函數之間有了一種無形的聯系。但是要想使它們之間產生直接的關系,還得需要一個橋梁來把它們之間連接起來。那這個橋梁就是Component了。 ![](http://upload-images.jianshu.io/upload_images/1504173-31fad8ca1aeb4c86.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) Inject.png **Component又是什么鬼** Component也是一個注解類,一個類要想是Component,必須用Component注解來標注該類,并且該類是接口或抽象類。我們不討論具體類的代碼,我想從抽象概念的角度來討論Component。上文中提到Component在目標類中所依賴的其他類與其他類的構造函數之間可以起到一個橋梁的作用。 那我們看看這橋梁是怎么工作的: Component需要引用到目標類的實例,Component會查找目標類中用Inject注解標注的屬性,查找到相應的屬性后會接著查找該屬性對應的用Inject標注的構造函數(這時候就發生聯系了),剩下的工作就是初始化該屬性的實例并把實例進行賦值。因此我們也可以給Component叫另外一個名字注入器(Injector) ![](http://upload-images.jianshu.io/upload_images/1504173-f0998db6b592459c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) component.png **小結下** 目標類想要初始化自己依賴的其他類: * 用Inject注解標注目標類中其他類 * 用Inject注解標注其他類的構造函數 * 若其他類還依賴于其他的類,則重復進行上面2個步驟 * 調用Component(注入器)的injectXXX(Object)方法開始注入(injectXXX方法名字是官方推薦的名字,以inject開始) Component現在是一個注入器,就像注射器一樣,Component會把目標類依賴的實例注入到目標類中,來初始化目標類中的依賴。 ## 為啥又造出個Module 現在有個新問題:項目中使用到了第三方的類庫,第三方類庫又不能修改,所以根本不可能把Inject注解加入這些類中,這時我們的Inject就失效了。 那我們可以封裝第三方的類庫,封裝的代碼怎么管理呢,總不能讓這些封裝的代碼散落在項目中的任何地方,總得有個好的管理機制,那Module就可以擔當此任。 可以把封裝第三方類庫的代碼放入Module中,像下面的例子: ~~~ @Module public class ModuleClass{ //A是第三方類庫中的一個類 A provideA(){ return A(); } } ~~~ ,**Module其實是一個簡單工廠模式,Module里面的方法基本都是創建類實例的方法**。接下來問題來了,因為Component是注入器(Injector),我們怎么能讓Component與Module有聯系呢? ### Component的新職責 Component是注入器,它一端連接目標類,另一端連接目標類依賴實例,它把目標類依賴實例注入到目標類中。上文中的Module是一個提供類實例的類,所以Module應該是屬于Component的實例端的(連接各種目標類依賴實例的端),Component的新職責就是管理好Module,Component中的modules屬性可以把Module加入Component,modules可以加入多個Module。 ![](http://upload-images.jianshu.io/upload_images/1504173-ec6228bcd54cc08a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) Component_橋梁概念.png 那接下來的問題是怎么把Module中的各種創建類的實例方法與目標類中的用Inject注解標注的依賴產生關聯,那Provides注解就該登場了。 ### Provides最終解決第三方類庫依賴注入問題 Module中的創建類實例方法用Provides進行標注,Component在搜索到目標類中用Inject注解標注的屬性后,Component就會去Module中去查找用Provides標注的對應的創建類實例方法,這樣就可以解決第三方類庫用dagger2實現依賴注入了。 # 總結 Inject,Component,Module,Provides是dagger2中的最基礎最核心的知識點。奠定了dagger2的整個**依賴注入框架**。 * Inject主要是用來標注目標類的依賴和依賴的構造函數 * Component它是一個橋梁,一端是目標類,另一端是目標類所依賴類的實例,它也是注入器(Injector)負責把目標類所依賴類的實例注入到目標類中,同時它也管理Module。 * Module和Provides是為解決第三方類庫而生的,Module是一個**簡單工廠模式**,Module可以包含創建類實例的方法,這些方法用Provides來標注 ![](http://upload-images.jianshu.io/upload_images/1504173-0b81f8a57768a703.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) component_module_inject.png 希望能幫您更好的理解dagger2。 [Android:dagger2讓你愛不釋手-重點概念講解、融合篇](http://www.jianshu.com/p/1d42d2e6f4a5) **個人簡介** 本人是一名android開發工程師,開發android多年,若有志同道合的朋友想聯系我,可以加我的:qq/微信: 704451290 作者:牛曉偉 鏈接:http://www.jianshu.com/p/cd2c1c9f68d4 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看