關於Dagger2使用的基礎如果你還不瞭解,可以參考我的上一篇文章解鎖Dagger2使用姿勢(一),這有助於你理解本篇文章。
OK,我們在上篇文章介紹另外Dagger2使用過程中四個基本的註解,分別是@Module、@Provides、@Inject以及@Component。今天我想來說說Dagger2中另外一個註解,那就是@Scope註解。看網上的資料,大家基本上都知道@Scope是用來給依賴劃定作用域的,那我今天就來來說說這個作用域的問題。
首先Dagger2中有一個現成的作用域註解,那就是@Singleton,其實這個@Singleton還是由Java提供的。那麼這個註解的作用域就是讓我們的依賴成爲單例模式。比如下面一個例子:假設我有一個用戶對象,如下:
我這裏暫時先用@Inject來註解這個用戶對象,避免使用Module,然後我需要一個Component來注入這個User對象到我的Activity中,我的Component如下:
OK,然後我在我的MainActivity中初始化User對象,並將其地址顯示出來:
顯示結果如下:
OK ,大家看到這完全是兩個不同的對象,兩個對象的引用地址完全不一樣。那如果我想讓User變爲一個單例模式該怎麼辦呢?其實很簡單,添加上@Singleton註解就可以了,在哪裏添加呢?兩個地方:
1.給User類添加上@Singleton註解:
2.給ActivityComponent添加上@Singleton註解
如此之後我再運行,結果如下:
OK,這個時候User對象就會以單例形式存在於我的App中了。OK,那如果我的項目中有Module,又該如何使我的User對象單例呢?
很簡單,在Module中提供User對象,提供User對象的方法需要有單例註解:
這個時候User對象上的註解就都可以去掉了,然後稍微修改一下ActivityComponent,如下:
然後MainActivity中初始化的代碼也要稍微修改一下下:
然後再運行,依然是單例模式。
OK,那我們知道@Singleton註解實際上實現的是一個全局單例模式,在實際開發中我們可能還需要一種局部單例的控件(這個應該是更常用),比如說我們有三個Activity,MainActivity,BActivity和CActivity,我們想讓MainActivity和BActivity共享同一個實例,而讓CActivity獲取另外一個實例,這又該怎麼實現呢?在Dagger2中,我們可以通過自定義Scope來實現局部單例。爽歪歪吧!OK,那就動手吧:
首先讓我們先來定義一個局部作用域:
然後在我們的UserModule和ActivityComponent中應用該局部作用域:
請大家注意,我的ActivityComponent作爲一個注入器只可以向MainActivity和BActivity兩個Activity中注入依賴,不可以向CActivity中注入依賴。最後,要讓該局部作用域產生單例效果,需要我們在自定義的Appliation類中來初始化這個Component,如下:
接下來我們在MainActivity和BActivity中注入依賴,MainActivity如下:
BActivity如下:
那麼如果我還想在CActivity中使用User對象該怎麼辦呢?再來一個CUserModule和CActivityComponent唄!
CUserModule如下:
這裏我沒有再註明單例了哦!
CActivityComponent如下:
在CActivity中注入依賴:
運行結果如下:
大家看到,MainActivity和BActivity是同一個實例,而CActivity則是另外一個實例。
那麼可能會有小夥伴問@UserScope在這裏到底起了什麼作用?我引用網上一段話:
以下文字來源:http://blog.csdn.net/u012943767/article/details/51941872
OK,這就是Dagger2中@Scope註解的使用。後面我再來介紹Component之間的依賴關係。
以上。