Java 使用组件依赖项时的单例问题

Java 使用组件依赖项时的单例问题,java,dagger-2,Java,Dagger 2,我在理解为什么下面的代码不起作用时遇到了一个问题 我有以下项目结构: @Component(modules = CCModule.class) public interface CComponent { XXX getXXX(); } 在哪里 @Module public class CCModule { @Provides @Singleton public XXX provide XXX(){ return new XXX(); } }

我在理解为什么下面的代码不起作用时遇到了一个问题

我有以下项目结构:

@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}
在哪里

@Module
public class CCModule {

    @Provides @Singleton
    public XXX provide XXX(){
        return new XXX();
    }
}

在哪里

我将所有内容初始化为:

CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();

AComponent a_component = Dagger_AComponent.builder()
        .cComponent(c_component)
        .aAModule(new AAModule())
        .build();
编译完成后,我会出现以下错误:

AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)
错误:(11,1)错误: com.test.CComponent(不适用范围)可能不适用 引用作用域绑定:@提供@Singleton com.test.XXX com.test.CCModule.provideXXX()


我的目标是让一个组件从其他组件继承绑定,从而对对象(单例)具有相同的引用。

您应该将
@Singleton
放入
CComponent
类声明中

@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)
非作用域组件不能具有作用域依赖项。因此,您需要将
设置为组件
的作用域。为此,请创建自定义
AScope
注释

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}
并用它注释组件:

@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}

这些是最新版本中出现的新要求。它已在相应的中讨论过,可能仍会更改。

看起来像是最新Dagger-2版本中的一个bug:

添加

@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {

}

用于组件,因为dagger2不允许将非作用域组件与作用域模块一起使用

@AlexanderVasiljev在最新快照上测试。工作正常=)。使用自定义
AScope
注释稍微更新了我的答案。你的代码有点不对劲。展示它。顺便说一句,我们用英语说吧,这不是俄语资源
@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {

}