Dagger 2 - Singleton class 创建了两次
Dagger 2 - Singleton class created twice
我有另外 2 个 class 依赖的单身人士 class:另一个单身人士和一项服务。问题是在实践中,他们每个人都会收到一个不同的实例,该实例应该是一个单身人士。我想弄清楚为什么。这是它的要点:
单例依赖class:
@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);
}
模块本身没有明确提供依赖关系,但一旦我这样做,一切都会按预期工作 - 同一个实例。
编辑 2
结论作为答案发布。
我明白了。我的单例 class 实现了一个接口,这是我依赖的 classes 所依赖的——而不是实现。我猜 Dagger2 无法实现这一飞跃,即使该实现具有注入的构造函数。
模块中的显式 @Provides
方法是唯一的方法。
另一个可能导致多次创建单例的原因是@Singleton 仅由@Component 强制执行。如果一个单例被另一个@Component(或同一组件的另一个实例)调用,它将是re-created.
我有另外 2 个 class 依赖的单身人士 class:另一个单身人士和一项服务。问题是在实践中,他们每个人都会收到一个不同的实例,该实例应该是一个单身人士。我想弄清楚为什么。这是它的要点:
单例依赖class:
@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);
}
模块本身没有明确提供依赖关系,但一旦我这样做,一切都会按预期工作 - 同一个实例。
编辑 2
结论作为答案发布。
我明白了。我的单例 class 实现了一个接口,这是我依赖的 classes 所依赖的——而不是实现。我猜 Dagger2 无法实现这一飞跃,即使该实现具有注入的构造函数。
模块中的显式 @Provides
方法是唯一的方法。
另一个可能导致多次创建单例的原因是@Singleton 仅由@Component 强制执行。如果一个单例被另一个@Component(或同一组件的另一个实例)调用,它将是re-created.