@scope其實(shí)為了實(shí)現(xiàn)單例
在dagger2 中有一個(gè)@Singleton 是它的具體實(shí)現(xiàn)奄妨,但是我們一般開發(fā)由于限制原因不會(huì)用到@Singleton
首先介紹下Compent的配置岛请,我們有一個(gè)ApplicationCompent 丧靡, 通常全局單例就放入這里面唤反,其它的ActivityCompent都會(huì)依賴它吟榴,目的就是需要獲取ApplicationCompent中已經(jīng)創(chuàng)建的實(shí)例坪它,來(lái)保證單例昔案。
@scope是成對(duì)出現(xiàn)的,
只有在Model中配置了@scope 并且在注入這個(gè)Model的Compent中配置同名的@scope 愚隧,才能確保這個(gè)Model在Compent的范圍類保證單例
所以比如我們自定義一個(gè)ApplicationScope
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}
這個(gè)@ApplicationScope 需要同時(shí)定義在Model和Compent中
@ApplicationScope
public class Init {
@Inject
public Init(){
}
}
@ApplicationScope
public interface MyApplicationCompoent {
void inject(MyApplication application);
Init getInit();
}
這里表示我的Init在MyApplication中全局單例蒂阱。
看看生成的代碼
this.initProvider = DoubleCheck.provider(Init_Factory.create(getProvider));
在每次創(chuàng)建Init的工廠時(shí),使用了DoubleCheck來(lái)創(chuàng)建狂塘,形成了單例录煤。
同理,
1.只要其他ActivityCompent依賴我的MyApplicationCompoent荞胡,就能夠保證Init為單例模式
2.我們可以繼續(xù)建立@ActivityScope 來(lái)保證某個(gè)Model在某個(gè)Activity的單例性質(zhì)妈踊。
tip:@scope的名稱隨意,只要在Model和Compent中成對(duì)出現(xiàn)即可