1. 程式人生 > >“一盤沙拉”帶你入門Dagger2(二)之帶引數怎麼辦

“一盤沙拉”帶你入門Dagger2(二)之帶引數怎麼辦

系列文章

如果被依賴類的建構函式帶有引數,要把這個引數的型別也管理起來

現在要在Salad裡新加入一個水果Orange,但是Orange的建構函式裡需要傳入一個Knife來切水果,那麼如何注入這個Orange呢?

  1. 新增的兩個類

    public class Orange {
        Knife knife;
        public Orange(Knife knife){
            this.knife=knife;
            knife.cut();
            Log.e("TAG", "我是一個桔子");
    
        }
    }
    public class
    Knife { public Knife() { Log.e("TAG", "我是一個小刀"); } public void cut() { Log.e("TAG", "我可以切水果"); } }
  2. 修改SaladModule類,讓他管理Orange和Knife

    一定要記得引入Knife,因為Salad的依賴Orange依賴了Knife,這是一個依賴鏈條,要把這個鏈條上的所有依賴,都管理起來。

    @Module
    public class SaladModule {
      .........
    
        //    引入建構函式帶引數的依賴
    @Provides public Orange provideOrange(Knife knife) { return new Orange(knife); } // 因為Salad所依賴的Orange又依賴了Knife,所以這裡也要把Knife管理起來 // 同理,如果這個Knife還依賴了別的類,也要在這裡引入 @Provides public Knife provideKnife() { return new Knife(); } }
  3. 修改SaladComponent,同樣記得寫Knife

    @Component(modules = {SaladModule.class})//指明要在那些Module裡尋找依賴
    public interface SaladComponent {
      .........
        //Salad的依賴Orange,而Orange又依賴了Knife,所以要把兩者都引入
        //Orange provideOragne(Knife knife);//★注意:這裡千萬不能帶引數,否則報錯
    
        Orange provideOragne();
        Knife provideKnife();
    
        //注意:下面的這個方法,表示要將以上的三個依賴注入到某個類中
        //這裡我們把上面的三個依賴注入到Salad中
        //因為我們要做沙拉
        void inject(Salad salad);
    
    }
  4. 在目標類Salad裡注入依賴

    public class Salad {
    
           .........
    
        @Inject//注入桔子
        Orange orange;
    
        @Inject//注入小刀(如果你想使用小刀物件,這裡要注入小刀,否則不用注入)
        Knife knife;
    
        public Salad() {
            // DaggerSaladComponent編譯時才會產生這個類,
            // 所以編譯前這裡報錯不要著急(或者現在你先build一下)
            SaladComponent saladComponent = DaggerSaladComponent.create();
            saladComponent.inject(this);//將saladComponent所連線的SaladModule中管理的依賴注入本類中
            makeSalad(pear, banana, saladSauce);
        }
    
        private void makeSalad(Pear pear, Banana banana, SaladSauce saladSauce) {
            Log.e("TAG", "我在攪拌製作水果沙拉");
        }
    }
  5. 測試

    09-01 13:34:35.532 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一個梨
    09-01 13:34:35.533 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一個香蕉
    09-01 13:34:35.533 10327-10327/com.demo.dagger2demo2 E/TAG: 我是沙拉醬
    09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一個小刀
    09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我可以切水果
    09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一個桔子
    09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我是一個小刀
    09-01 13:34:35.534 10327-10327/com.demo.dagger2demo2 E/TAG: 我在攪拌製作水果沙拉
    

相關推薦

入門Dagger2引數怎麼辦

系列文章 如果被依賴類的建構函式帶有引數,要把這個引數的型別也管理起來 現在要在Salad裡新加入一個水果Orange,但是Orange的建構函式裡需要傳入一個Knife來

入門Dagger2@Qualifier

系列文章 當一個類有兩個建構函式時,使用Dagger2時,如何獲取指定建構函式new出來的物件 或者說雖然這有一個建構函式,但是這個建構函式new出了兩個具有不同屬性的

DartDiao之類

在上一篇部落格,筆者介紹了Dart類的構造方法 帶你Dart帶你Diao之類(一) 這一篇部落格是介紹Dart類的其他內容,主要包括: Getters和Setters 方法 抽象類和抽象方法 隱式介面 繼承 列舉 mi

SiteMesh入門包含靜態HTML導致亂碼問題。

首先要了解SiteMesh機制,因為他是過濾器,會攔截你的請求根據自己的規則給你返回,所有如果你沒有設定編碼,SiteMesh將會用自己編碼,預設編碼是ISO8859-1。至於為什麼亂碼建議去看看孫鑫講過一章關於亂碼的問題。 在一個網上有很多講解關於如果決絕包含HTML會導

NS2入門學習tcl指令碼示例

1、示例分析 tcl語法與python相差不多,以《NS與網路模擬》中的第一個tcl指令碼為例,學習如下:#建立一個Simulator物件的例項並把它賦值給變數ns set ns [new Simulator] #開啟一個名為linktrace.tr的檔案,用來記錄模擬過程

DQNDeep Q-learning入門教程最優選擇

在上一篇部落格:[DQN(Deep Q-learning)入門教程(一)之強化學習介紹](https://www.cnblogs.com/xiaohuiduan/p/12945449.html)中有三個很重要的函式: - 策略:$\pi(a|s) = P(A_t=a | S_t=s)$ - 狀態價值函式:

GAN網路從入門教程GAN原理

在一篇部落格[GAN網路從入門教程(一)之GAN網路介紹](https://www.cnblogs.com/xiaohuiduan/p/13237486.html)中,簡單的對GAN網路進行了一些介紹,介紹了其是什麼,然後大概的流程是什麼。 在這篇部落格中,主要是介紹其數學公式,以及其演算法流程。當然數學公

三篇文章極速入門phpphp原生實現登陸註冊

區別 找不到 oot arr 字符串拼接 value 前端 信任 .get 看下成果 ps:純天然h5,絕不添加任何添加劑(css)以及化學成分(js)(<( ̄ ﹌  ̄)我就是喜歡純天然,不接受任何反駁) 關於本文 用原生的php和html做了一個登陸註冊,大概是可

三分鐘入門 redis 高可用架構哨兵

什麼是哨兵? 哨兵(Sentinel)是 redis 的高可用性解決方案,前面我們講的主從複製它是高可用的基礎,需要人工介入才能完成故障轉移,哨兵可以解決這個問題,在主從複製情況下,當主節點發生故障時,哨兵可以自動的發現故障並且完成故障轉移,實現真正的 redis 高可用。在哨兵叢集中,哨兵會監視所有的 re

樹義學 Prometheus:Grafana 圖表配置快速入門

# 文章首發於【陳樹義】公眾號,點選跳轉到原文:https://mp.weixin.qq.com/s/sA0nYevO8yz6QLRz03qJSw 前面我們使用 Prometheus + Grafana 實現了一個簡單的 CPU 使用率變化圖,但是這個圖還有許多缺陷,例如:左邊欄的數值太小了無法調整,下面的

「mysql優化專題」這大概是篇最好的mysql優化入門文章1

left 機械 增刪改查 靜態 命中 mysql查詢 關註 mysq 增刪改 優化,一直是面試最常問的一個問題。因為從優化的角度,優化的思路,完全可以看出一個人的技術積累。那麽,關於系統優化,假設這麽個場景,用戶反映系統太卡(其實就是高並發),那麽我們怎麽優化? 如果請

python3入門教程操作資料庫

概述   最近在準備寫一個爬蟲的練手專案,基本想法是把某新聞網站的內容分類爬取下來,儲存至資料庫,再通過介面對外輸出(提供後臺查詢介面)。那麼問題就來了,python到底是怎麼去操作資料庫的呢?我們今天就來研究下。   準備 我這邊資料庫使用的是mysql5.7,python去操作mysql

python3入門教程操作數據庫

pri 只需要 圖片 pytho 對象 ima cdc 一行 結果 概述   最近在準備寫一個爬蟲的練手項目,基本想法是把某新聞網站的內容分類爬取下來,保存至數據庫,再通過接口對外輸出(提供後臺查詢接口)。那麽問題就來了,python到底是怎麽去操作數據庫的呢?我們今天就來

安裝迷你mini版的虛擬機器

一、建立虛擬機器 1、在VMware中的主頁中選擇“ 建立新的虛擬機器”: 2、點選下一步: 3、點選下一步: 4、點選下一步: 5、可以自定義設定虛擬機器名稱,修改虛擬機器的儲存位置,然後點選下一步: 6、點選下一步: 7、點

python3入門教程操作資料庫

import pymysql # 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式) conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset

趙童鞋帶入門PHP PHP進階語法

閱讀時長:10分鐘 技術預備:PHP基礎語法 通過上一篇的學習,相信童鞋們已經大概瞭解了PHP的變數和陣列,這篇雖然叫進階語法,但其實也還是基礎語法,只是為了和上一篇做一個區別。(在程式設計界再怎麼高階的東西始終會在時間的車輪下變成基礎) 本節主要講解PHP的運算子、函式和麵向物件。 依照

深入AI1 - 深度學習模型訓練痛點及解決方法

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 自然語言處理1 – 分詞 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結 帶你深入AI(3)- 物體分類領域:AlexNet VGG I

深入AI7- 深度學習重要Python庫

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 自然語言處理1 – 分詞 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結 帶你深入AI(3)- 物體分類領域:AlexNet VGG I

深入AI6- 詳解bazel

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 自然語言處理1 – 分詞 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結 帶你深入AI(3)- 物體分類領域:AlexNet VGG I

深入AI5- 自然語言處理領域:RNN LSTM GRU

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 自然語言處理1 – 分詞 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 帶你深入AI(2)- 深度學習啟用函式,準確率,優化方法等總結 帶你深入AI(3)- 物體分類領域:AlexNet VGG I