Android Dagger2,Singleton交叉组件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Dagger2,Singleton交叉组件相关的知识,希望对你有一定的参考价值。

我遇到了Singleton与android的Dagger2库有问题。我的问题是我使用@Singleton但得到两个不同的对象= [

我有2个组件和2个模块:

DispatcherComponent,包含提供Dispatcher的DispatcherModule类。 Dispatcher需要StoreModule提供的实例UserStore。

@Singleton
@Component(modules={AppModule.class, StoreModule.class, DispatcherModule.class})
public interface DispatcherComponent {
    void inject(SomeClass someClass);
}

DispatcherModule.class如下所示

@Module
public class DispatcherModule {
    @Provides
    @Singleton
    public Dispatcher provideDispatcher(UserStore store) {
        Log.d("DEBUG", "userStore : " + store.toString());
        return new Dispatcher(store);
    }

现在是StoreComponent.class

@Singleton
@Component(modules={AppModule.class, StoreModule.class})
public interface StoreComponent {
    void inject(SomeOtherClass otherClass);
}

和StoreModule.class

@Module
public class StoreModule {
    @Provides
    @Singleton
    public UserStore provideUserStore() {
        return new UserStore();
    }

现在当我试图注入UserStore我得到两个不同的对象= /

public class SomeOtherClass extends Acitivity {
    @Inject UserStore mStore;
    public void onCreate(Bundle savedInstance) {
        StoreComponent comp = ((MyApp) getApplication).getStoreComponent();
        comp.inject(this);
        Log.d("DEBUG", "userStore2 :" + mStore.toString());
       }
}

public class SomeClass {
    @Inject Dispatcher mDispatcher;
    public SomeClass (Application application) {
        ((MyApp) application).getDispatcherComponent().inject(this);
    }

最后,这就是我创建组件的方式:

public class MyApp extends Application {
    public void onCreate() {
        StoreModule store = new StoreModule();
        StoreComponent storeComponent = DaggerStoreComponent.builder().appModule(new AppModule(this)).storeModule(storeModule).build();
        DispatcherComponent disComp = DaggerDispatcherComponent.builder().appModule(new AppModule(this)).storeModule(storeModule).dispatcherModule(new DispatcherModule()).build();
}

现在,当我运行应用程序时,我得到2个不同的对象!有人能帮我吗 ?我应该怎么解决?我不想要一个神组件..

谢谢!

答案

请注意,@ Singleton实际上并没有使对象成为单例,而只是使用DoubleCheck类来缓存由dagger生成的组件impl所持有的类。检查DaggerDispatcherComponent以获取更多详细信息。

对于这种情况,您可以更改StoreModule,如下所示:

@Module
public class StoreModule {
    private UserStore mStore;

    @Provides
    @Singleton
    public UserStore provideUserStore() {
        return getStore();
    }

    private UserStore getStore() {
        //lazy initialized and make sure thread safe
       if (null == mStore) {
           @synchronized(StoreModule.class) {
               if (null == mStore) {
                   mStore = new UserStore();
               }
           }
       }
       return mStore;
    }
}

以上是关于Android Dagger2,Singleton交叉组件的主要内容,如果未能解决你的问题,请参考以下文章

Dagger2源码浅析

Dagger2入门详解

AndroidDagger2从入门到再入门(进阶)

Dagger2 scope

Dagger2 中的 Scope

Dagger2学习笔记5(关于Lazy,Provide的使用)