我有其他2个类依赖的单例类:另一个单例和服务。问题在于,在实践中,每个人都会收到一个应该是单身人士的不同实例。我试图找出原因。以下是它的要点:
单例依赖类:
@Singleton
public class SingletonDependency {
@Inject
public SingletonDependency() {
// ...
}
}
依赖于它的另一个单身人士:
@Singleton
public class DependentClass {
@Inject
public DependentClass(SingletonDependency singletonDependency) {
// ...
}
}
依赖它的服务:
public class DependentService extends Service {
@Inject SingletonDependency mSingletonDependency;
@Override
public void onCreate() {
CoreInjector.INSTANCE.getCoreComponent().inject(this);
}
}
我没有明确提供SingletonDependency
,因为它有一个@Inject
构造函数,而Dagger2会为我处理它。这是它的根源吗?
这是我的注射器:
public enum CoreInjector {
INSTANCE;
private CoreComponent mCoreComponent;
public void init(Context context) { // called by the Application's onCreate()
mCoreComponent = DaggerCoreComponent.builder()
.coreModule(new CoreModule(context))
.build();
}
public CoreComponent getCoreComponent() {
return mCoreComponent;
}
}
组件本身:
@Singleton
@Component(modules = {CoreModule.class})
public interface CoreComponent {
void inject(DependentService dependentService);
}
模块本身并没有明确地提供依赖,但是一旦我这样做,一切都按预期工作 - 同样的实例。
结论作为答案发布。
答案 0 :(得分:1)
我明白了。我的单例类实现了一个接口,这是我的依赖类所依赖的 - 而不是实现。我猜Dagger2即使实现有一个注入的构造函数也无法实现这一飞跃。
模块中的显式@Provides
方法是唯一的方法。
答案 1 :(得分:0)
对于那些具有相同问题的人,导致多次创建单例的另一个原因是@Singleton仅由@Component强制执行。如果单例被另一个@Component(或同一组件的另一个实例)调用,它将被重新创建。