簡單介紹 Dagger2 的入門使用

依賴注入

在介紹 Dagger2 這個之前,必須先解釋一下什么是依賴注入,因為這個庫就是用來做依賴注入的。所以這里先簡單用一句話來介紹一下依賴注入:
依賴注入是一種設計模式,它允許對象在運行時注入其依賴項。而不是在編譯時確定(也就是硬編碼)。通過這種方式,可以更好地解耦代碼,提高測試性和可維護性。
詳細了解依賴注入,這里建立先看完這個博文,詳細介紹了這個概念和實現方式:Java 基礎知識之 依賴注入(Dependency Injection)

Dagger2

上面的博客已經介紹了,依賴注入有很多不同的框架都可以做這個事,那為什么選擇 Dagger2 呢?對于后端開發可能會用 Spring,而對于 Android 開發,只能用 Dagger2 了。這主要是因為這個庫本身就是由 Google 推出的,而且它通過注解處理器生成高效的依賴注入代碼,避免了運行時反射產生的性能開銷。在 Android 源代碼項目中,廣泛使用了這個庫。

這里重點注意 Dagger2 這個庫與其他依賴注入庫的區別在于 Dagger2 使用的是注解處理器,而不是運行時反射。如果不了解這兩個方式的區別可以看一些這個:
制作自己的ButterKnife(使用AutoService和APT注解處理器在編譯期生成Java代碼)
制作自己的 @OnClick、@OnLongClick(告別setOnClickListener,使用注解、反射和動態代理)
使用注解處理器可以在編譯時生成代碼來完成功能,這比使用運行時反射要快很多。而性能在 Android 這種嵌入式設備中相當重要,因此對于 Android 開發者來說,如果使用依賴注入,這個庫就是必選的。

基本概念

在使用 Dagger2 這個庫時,主要會有三個角色:

  • 依賴需求方:就是需要依賴對象的那些類。例如一個人想要玩電腦,那么他就必須得有一臺電腦,因此這個人就是依賴需求方;
  • 依賴供應方:負責提供依賴對象,類似與實際編碼中的工廠類,這個人依賴一臺電腦玩游戲,那么就必須有個地方能夠提供一臺電腦,這個地方就是依賴供應方,顧名思義,就是用于創建以來對象的;
  • 依賴注入器:負責將以來對象注入到以來需求方,在實際代碼中是一個接口,編譯時 Dagger2 自動生成的就是這個接口的實現類。接著上面的說,這個人是依賴需求方,他需要一臺電腦,依賴供應方能夠提供一臺電腦,可是這兩者沒有打通啊,電腦沒有給到這個人,他還是玩不了游戲啊,因此這個時候就由依賴注入器將這臺電腦注入給這個人,他就能夠使用這臺電腦玩游戲了。

上面已經說得很形象了,大家應該都能理解,不能理解的,可以想象下面的一個場景。
你需要一臺電腦打游戲,那么你依賴于電腦,你就是依賴需求方,依賴對象是一臺電腦。這臺電腦哪里能提供呢?當然是淘寶、京東、實體店了,這些都能提供一臺電腦,那么它們都是依賴供應方。但是這中間必須得有個東西把電腦從供應商的倉庫送到你手里,你才能用,這就可以理解為將電腦這個依賴對象注入到你手中。什么是依賴注入器呢?在這里例子中,那就是三通一達這些快遞公司了。

就是一個簡單的購物的流程,只是把依賴注入的概念套進去了而已。下面我們就以這個場景為例,寫個 Demo,告訴大家如何使用 Dagger2 這個庫。

引入 Dagger2

截止到目前,Dagger2 這個庫的最新版本是 2.51.1。引入這個庫的方式也很簡單,在 build.gradle 中添加如下依賴:

dependencies {implementation 'com.google.dagger:dagger:2.51.1'annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1'
}

大家再引入的時候最好查看一下 Dagger 的官網,引入最新的版本:https://dagger.dev/
在引入依賴并 Sync Project 之后,你會發現項目的依賴會多出來兩個庫:

編寫依賴需求方

先編寫一個 Person 類,里面有一個 playGame 的方法,這個方法中要使用 Computer,也就是說,Computer 是 Person 的依賴,我們使其成為一個成員變量:

public class Person {private String name;private Computer computer;public void Person(String name) {this.name = name;    }public void playGame(String gameName) {computer.play(gameName);}
}

以下是 Computer 類,作為依賴對象:

public class Computer {private String name;public Computer(String name) {this.name = name;}public void play(String game) {System.out.println("使用 " + name + " 玩 " + game);}
}

編寫依賴供應方

現在,有了依賴需求方,那就要找到依賴提供商提供一臺電腦。哪里能提供電腦呢,那就先編寫一個淘寶類吧:

@Module
public class TaoBao {private Computer assembleComputer() {         //組裝一臺電腦Computer computer = new Computer("淘寶的電腦");return computer;}@Providespublic Computer getComputer() {return assembleComputer();}
}

這里注意兩個注解 @Module 和 @Provides,這兩個注解是 Dagger 提供的。其中 @Module 用于告知 Dagger 這個類是一個依賴提供商,@Provides 用于告知 Dagger 這個依賴提供商里面哪些方法是用于提供依賴對象的。
在這個例子中, TaoBao 是一個依賴供應方,其中 getComputer 用于提供依賴對象,assembleComputer 則是一個普通方法。

編寫依賴注入器

有了需求方和供應方,那么就需要將兩者鏈接起來,依賴對象只有從供應方交給需求方,才有意義,這就是依賴注入器的工作。在這個例子中,依賴注入器就是快遞了,快遞把電腦從淘寶店家送到買家手中。這里我們就先編寫一個中通吧:

@Component(modules = TaoBao.class)
public interface ZTOExpress {void deliverTo(Person person);
}

注意這個注入器是一個 interface 而非 class,在編譯時,Dagger 會生成對應的實現類。
這個接口添加了一個注解:@Component,這個注解是就是告訴注入器,從哪個依賴供應方拿依賴對象。這段代碼里,@Component 注解告知了中通,去淘寶拿電腦快遞給買家。
但還有一個問題,中通知道將電腦配送給買家,那配送到那個成員變量呢?Person 里有 name 和 computer,從名字上就能看到電腦肯定要配送到 computer 的成員變量上,這個時候需要將 computer 這個成員變量添加 @Inject 注解:

public class Person {private String name;@Injectprivate Computer computer;//......
}

依賴注入結果

現在三個角色都有了,那我們現在就把它們拼接在一起,看看效果吧。

Person person = new Person("張三");
ZTOExpress ztoExpress = DaggerZTOExpress.builder().taoBao(new TaoBao()).build();
ztoExpress.deliverTo(person);
person.playGame("賽博朋克2077");

輸入:

System.out    I  使用 淘寶的電腦 玩 賽博朋克2077

總結

先講到這里。后續再補全。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42902.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Andorid 11 InputDispatcher FocusedApplication設置過程分析

在Input ANR中,有一類ANR打印的reason 為 “xx does not have a focused window” ,表明 輸入事件 5s 內,只有FocusedApplication,而沒找到focused window。本文分析下FocusedApplication的設置過程。 setFocusedApp 源碼路徑&am…

iOS 應用內存超過多少會收到系統內存警告 ?

iOS 應用內存超過多少會收到系統內存警告 ? 在 iOS 應用中,系統內存警告的觸發是由 iOS 操作系統動態決定的,并不是一個固定的閾值。系統會根據當前設備的可用內存、正在運行的其他應用程序的內存需求以及當前應用程序的內存占用情況來判斷是…

用PlantUML可視化顯示JSON

概述 PlantUML除了繪制UML中的一些標準圖之外,也可以以圖形化的方式顯示一些其他圖形或數據形式的結構,這其中就包括JSON。 它以一種簡單且優美的圖形形式,表達了JSON的結構。你可以用它來作為設計JSON數據文件的依據,輔助設計或…

day01:項目概述,環境搭建

文章目錄 軟件開發整體介紹軟件開發流程角色分工軟件環境 外賣平臺項目介紹項目介紹定位功能架構 產品原型技術選型 開發環境搭建整體結構:前后端分離開發前后端混合開發缺點前后端分離開發 前端環境搭建Nginx 后端環境搭建熟悉項目結構使用Git進行版本控制數據庫環…

【C++】AVL樹(旋轉、平衡因子)

🌈個人主頁:秦jh_-CSDN博客🔥 系列專欄:https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ? 目錄 前言 AVL樹的概念 節點 插入 AVL樹的旋轉 新節點插入較高左子樹的左側---左左:…

【C++】stack和queue的模擬實現 雙端隊列deque的介紹

🔥個人主頁: Forcible Bug Maker 🔥專欄: STL || C 目錄 🌈前言🔥stack的模擬實現🔥queue的模擬實現🔥deque(雙端隊列)deque的缺陷 🌈為什么選擇…

基于Go 1.19的站點模板爬蟲

創建一個基于Go 1.19的站點模板爬蟲涉及到幾個關鍵步驟:初始化項目,安裝必要的包,編寫爬蟲邏輯,以及處理和存儲抓取的數據。下面是一個簡單的示例,使用goquery庫來解析HTML,并使用net/http來發起HTTP請求。…

【containerd】解決敲擊crictl images命令報錯問題

【Containerd】解決輸入crictl images命令報錯問題 文章目錄 【Containerd】解決輸入crictl images命令報錯問題問題復現解決辦法驗證結果參考鏈接 問題復現 [rootmaster01 ~]# crictl images WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim…

七、Docker常規軟件安裝

目錄 一、總體步驟 二、安裝tomcat 1、docker hub上查找tomcat鏡像 三、安裝MySQL 1、查看MySQL鏡像 2、拉取MySQL鏡像到本地,本次拉取MySQL5.7 3、使用MySQL鏡像創建容器 4、使用Windows數據庫工具,連接MySQL實例 5、常見問題 6、創建MySQL容器實例 7、新…

DDP:微軟提出動態detection head選擇,適配計算資源有限場景 | CVPR 2022

DPP能夠對目標檢測proposal進行非統一處理,根據proposal選擇不同復雜度的算子,加速整體推理過程。從實驗結果來看,效果非常不錯 來源:曉飛的算法工程筆記 公眾號 論文: Should All Proposals be Treated Equally in Object Detect…

同聲傳譯app哪個好免費?對話交流推薦這5個

暑期到,也是旅游出行的好日子~自打周邊不少國家都開放免簽政策之后,出國游也變得更加方便了~對于外語水平不高的朋友來講,想要保證出行體驗,其實手上只要備好一個同聲傳譯app就OK! 倘若你還不清楚都有哪些同聲傳譯app…

背部筋膜炎的癥狀及治療

背部筋膜炎,也稱為胸背肌筋膜炎,主要是由于勞損或風寒濕邪侵入引起的。其典型癥狀主要包括: 1、疼痛:背部筋膜一旦出現炎癥性病變,會對周圍交感神經組織產生刺激作用,從而引起不同程度的疼痛癥狀。 2、僵…

NAT:地址轉換技術

為什么會引入NAT? NAT(網絡地址轉換)的引入主要是為了解決兩個問題 IPv4地址短缺:互聯網快速發展,可用的公網IP地址越來越少。網絡安全:需要一種方法來保護內部網絡不被直接暴露在互聯網上。 IPv4 &…

低通濾波以及卡爾曼濾波

先講解幾個低通濾波,低通濾波比卡爾曼濾波簡單,因為卡爾曼濾波涉及到兩個輸入量,一個是控制量,一個是觀測量,而低通濾波是一個輸入量 1,利用工具箱配置低通濾波 參考地址:https://blog.csdn.net…

SystemUIService啟動-Android13

SystemUIService啟動-Android13 1、SystemUIService啟動2、其他SystemUI services啟動2.1 Dagger依賴注入2.2 Recents為例 1、SystemUIService啟動 SystemUI啟動&#xff0c;及其SystemUIService啟動 <!-- SystemUi service component --><string name"config_s…

應用層協議原理——可供應用程序使用的運輸服務

前面講過套接字是應用程序進程和運輸層協議之間的接口。在發送端的應用程序將報文推進該套接字。在該套接字的另一側&#xff0c;運輸層協議負責使該報文進入接收進程的套接字。 包括因特網在內的很多網絡提供了不止一種運輸層協議。當開發一個應用時&#xff0c;必須選擇一種可…

什么是海外倉管理自動化?策略及落地實施步驟指南

作為海外倉的管理者&#xff0c;你每天都面臨提高海外倉運營效率、降低成本和滿足客戶需求的問題。海外倉自動化管理技術為這些問題提供了不錯的解決思路&#xff0c;不過和任何新技術一樣&#xff0c;從策略到落地實施&#xff0c;都有一個對基礎邏輯的認識過程。 今天我們整…

重生奇跡mu的地圖名

地圖之一&#xff1a;勇者大陸 勇者大陸地處奇跡大陸中央。終年陰雨連綿&#xff0c;氣候潮濕悶熱。植物由充滿黑暗陰森氣氛的草地所構成。這里的NPC數量是所有地圖中最多的。因為地步交通要沖&#xff0c;所以也是玩家聚集最多的地方。 這里是劍士、魔法師、魔劍士和圣導師初…

vue3關于在線考試 實現監考功能 推流拉流

vue3 關于在線考試 實現監考功能&#xff0c; pc端考試 本質是直播推流的功能 使用騰訊云直播: 在線文檔 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/f…

永磁同步電機控制算法--最大轉矩電流比控制(虛擬信號注入法)

目前&#xff0c;國內外相關學者對 MTPA 控制方法進行了一系列的理論研究與仿真分析。通過研究取得的成果綜合來看&#xff0c;該控制方法主要有&#xff1a;直接公式計算法、曲線擬合法、查表法、搜索法、高頻信號注入法以及參數辨識法等。 之前的文章中已經介紹了直接公式計…