Dagger2 匪夷所思,結果那麼愛你

2021-09-23 06:50:08 字數 2724 閱讀 9094

開天闢地

今天我們來講講乙個有一點點冷門的庫dagger吧。我做乙個不負責任的猜測:做客戶端的同學可能比較少聽到一些名詞,比如面向切面程式設計、控制反轉、依賴注入,相信玩過spring的同學肯定知道這些一開始讓人頭大後來卻很好玩的玩意兒。

今天我們來介紹這款依賴注入器 —— dagger2,源自square的dagger,由google開發,基於apt生成靜態編譯時的依賴注入工具,比動態注入的方式更加高效能,但是需要更多的約定。

官網:組成

dagger2(以下稱為dagger) 主要由兩個部分組成:component和module。分別作為注入器和注入源存在於整個依賴圖中,然後有了源和工具,那麼只用在我們需要注入的地方加上@inject註解即可,它是屬於jsr-330的一部分,我們這裡就直接引入乙個最簡單的demo。

module

@module 

public

public

} @provides 

public

context providecontext() 

@provides 

public

service provideservice(context context)  

} 這是世界的起源。

component

public

context context(); 

service service(); 

}被注入物件

public

@inject service mservice; 

/** 

* 應用程式初始化 

*/ @override 

public

void oncreate()  

public

return

} } 

作用域

我們說依賴注入的時候,作用域(scope)是經常會出現在我們眼裡的詞彙。控制變數生命週期,實質就是控制它存在的作用域,服務端典型的作用域如單例(singleton),request,session,等等,它們的變數分別存在於不同的生命週期。

我們預設存在的是singleton,也就是@singleton註解。由它標註的provider生成的物件會被快取起來,用singlecheck或者doublecheck進行包裝。我們provider指定的作用域需要和component的作用域一致。

比如component這樣定義:

@singleton 

public

service service(); 

} 而module就是這個樣子

@module 

public

public

} @singleton 

@provides 

public

context provideservice() 

}限定符

dagger還支援使用限定符(qualifier)來指定注入的物件,比如內建的@named限定符,我們在需要特定限定名字的變數的時候,可以在@inject上,指定@named限定符,獲取指定物件。

//module 

@providers 

@named("cache"

) public

service provideservice(); 

// injection 

@inject 

@named("cache"

) service mservice; 

這樣就給這個mservice注入了名字為"cache"的例項了。

乙個簡單場景的應用

當我們談論依賴注入的時候,我們在談論什麼?

其實我們是在討論 作用域。

這是什麼意思呢,我相信每乙個程式設計師去實現乙個單例是一件非常簡單的事情,makeinstance和getinstance嘛。但是,你們想過維護「雙例」嗎?我之前碰到了乙個場景如下:

使用者(user) 需要一張tag表,會增刪查改,並和使用者相關聯。

問題(question) 也需要一張tag表,也會增刪查改,和問題關聯。

這兩張表的實體模型一模一樣。

那麼我們採取的方案有兩種,雙表,或者雙庫。雙表的話,對orm很不友好,因為orm是根據類來確定表的,我們為了**簡潔優雅,不可能建立兩個一模一樣的類,不然取名都變成一件困難的事。這裡,乙個優勢是,我使用的orm庫首先是維護乙個單例,單例進行crud操作,且乙個單例和乙個資料庫相關。於是我使用qualifer的特性,生成了兩個例項(也就是對應了兩個資料庫),分別注入到不同的業務模型中去,他們就可以使用同乙個類,而且對tag的修改完全沒有影響。這件事要是我們自己去做的話,可能要寫很多骯髒不堪的**,但是dagger只用2個註解就把我的需求解決了。

總結

好了,本文簡單的闡述了dagger入門使用,總結起來,我們只要約定好componenet、module,搭配inject使用,即可實現乙個靜態的依賴注入流程。下一次我們詳細介紹dagger生成的**結構。

Dagger2學習筆記

dagger需要注入依賴的地方,需要 inject的註解,共有三種inject方式 identifies injectable constructors,methods,and fields.constructors首先被注入,然後是method和field,父類中的method和field會先於子...

Dagger2 學習筆記

google官方mvp dagger2架構詳解 從零開始搭建android框架系列 6 參考文章 dagger2 使用詳解 1 inject 和 provide 兩種依賴生成方式區別 a.inject 用於注入可例項化的類,provides 可用於注入所有類 b.inject 可用於修飾屬性 構造器...

Dagger2 註解 初識

看部落格之前請先走出這個誤區 module和model,前者指建立依賴物件的物件,後者指的依賴的物件 也就是模型bean dagger2的幾個註解 module,提供建立依賴物件的方法。注意 不能有兩個 provides方法返回同乙個model,否則會報以下異常 2.component,鏈結modu...