Android Dagger2,Singleton交叉组件

知识就是力量,时间就是生命。这篇文章主要讲述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以获取更多详细信息。
【Android Dagger2,Singleton交叉组件】对于这种情况,您可以更改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; } }


    推荐阅读