上篇已經(jīng)學(xué)到了sington的用法。最后一段提供了一個(gè)全局注入單實(shí)例的思路。本文就講訴一下
需要全局注入單實(shí)例的類
public class DslBean{
public DslBean() {
}
}
App層面的module和component
@Module
public class AppModule {
private MyApp app;
public AppModule(MyApp app) {
this.app = app;
}
@Singleton
@Provides
MyApp provideApp(){
return app;
}
@Singleton
@Provides
DslBean provideAppBean(){
return new DslBean();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
//為什么要寫這兩個(gè)方法,后面解釋
MyApp getApp();
DslBean getDslBean();
void inject(MyApp app);
}
上面的沒什么特別,相信經(jīng)過前面幾篇文章的熏陶,這些都是小菜,注意@sington就好了
Activity層面的module和component
@Module
public class ActivityModule {
//因?yàn)檫@里我不注入對(duì)象到界面,所以沒代碼
}
//區(qū)別一:需要添加否則報(bào)錯(cuò)(因?yàn)閷?duì)這個(gè)地方還不是很了解,暫放)
@ActivityScope
//區(qū)別二:繼承依賴AppComponent
@Component(modules = ActivityModule.class,dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
@Scope
@Retention(RUNTIME)
public @interface ActivityScope {}
我們現(xiàn)在反過來解釋,為什么上面AppComponent需要提供那兩個(gè)方法。因?yàn)?。ActivityComponent需要從AppComponent獲取那些單實(shí)例對(duì)象注入到界面中去,所以要繼承依賴他,并且AppComponent需要提供返回值為單實(shí)例的方法,不用參數(shù)。
最后mark project ,在onCreate調(diào)用
AppComponent appComponent = myapp.getAppComponent();
DaggerActivityComponent.builder().appComponent(appComponent).build().inject(this);
即可
大概流程圖

Dagger大功告成
感謝已婚男士小熊的指點(diǎn)。