使用组件依赖项时单例的问题
Problems with singletons when using component dependencies
我无法理解为什么以下代码不起作用。
我有以下项目结构:
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
其中
@Module
public class CCModule {
@Provides @Singleton
public XXX provide XXX(){
return new XXX();
}
}
和
@Component(dependencies = CComponent.class, modules = AAModule.class)
public interface AComponent {
YYY getYYY();
}
哪里
class YYY {
@Inject
public YYY(XXX xxx) {
...
}
}
我将所有内容初始化为:
CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();
AComponent a_component = Dagger_AComponent.builder()
.cComponent(c_component)
.aAModule(new AAModule())
.build();
编译完成后出现以下错误:
Error:(11, 1) error:
com.test.CComponent (unscoped) may not
reference scoped bindings: @Provides @Singleton
com.test.XXX
com.test.CCModule.provideXXX()
我的目标是让一个组件从其他组件继承绑定,以对对象(单例)具有相同的引用。
您应该将 @Singleton
放入 CComponent
class 声明。
@Singleton
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
解释在错误消息中:CComponent
是无作用域,@Singleton
是作用域。 Dagger 2 不允许非作用域组件使用具有作用域绑定的模块。
但是,现在您将收到以下错误:
AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)
未限定范围的组件不能具有限定范围的依赖项。所以你需要使 AComponent
范围。为此,请创建自定义 AScope
注释。
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}
并用它注释AComponent
:
@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}
这些是最近 snapshot release. It was discussed in corresponding issue 中出现的新要求,可能仍会更改。
看起来像是最新 Dagger-2 版本中的错误:
https://github.com/google/dagger/issues/107
添加
@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {
}
对于组件,因为 dagger2 不允许将非作用域组件与作用域模块一起使用
我无法理解为什么以下代码不起作用。
我有以下项目结构:
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
其中
@Module
public class CCModule {
@Provides @Singleton
public XXX provide XXX(){
return new XXX();
}
}
和
@Component(dependencies = CComponent.class, modules = AAModule.class)
public interface AComponent {
YYY getYYY();
}
哪里
class YYY {
@Inject
public YYY(XXX xxx) {
...
}
}
我将所有内容初始化为:
CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();
AComponent a_component = Dagger_AComponent.builder()
.cComponent(c_component)
.aAModule(new AAModule())
.build();
编译完成后出现以下错误:
Error:(11, 1) error: com.test.CComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()
我的目标是让一个组件从其他组件继承绑定,以对对象(单例)具有相同的引用。
您应该将 @Singleton
放入 CComponent
class 声明。
@Singleton
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
解释在错误消息中:CComponent
是无作用域,@Singleton
是作用域。 Dagger 2 不允许非作用域组件使用具有作用域绑定的模块。
但是,现在您将收到以下错误:
AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)
未限定范围的组件不能具有限定范围的依赖项。所以你需要使 AComponent
范围。为此,请创建自定义 AScope
注释。
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}
并用它注释AComponent
:
@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}
这些是最近 snapshot release. It was discussed in corresponding issue 中出现的新要求,可能仍会更改。
看起来像是最新 Dagger-2 版本中的错误: https://github.com/google/dagger/issues/107
添加
@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {
}
对于组件,因为 dagger2 不允许将非作用域组件与作用域模块一起使用