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

时间:2015-01-27 12:13:55

标签: 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(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();

编译完成后,我收到以下错误:

  

错误:(11,1)错误:   com.test.CComponent(unscoped)可能没有   引用范围绑定:@Provides @Singleton   com.test.XXX   com.test.CCModule.provideXXX()

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

3 个答案:

答案 0 :(得分:110)

您应该将@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)

未范围的组件不能具有范围依赖性。所以你需要制作AComponent范围。为此,请创建自定义AScope注释。

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}

并用它注释AComponent

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

这些是最新snapshot release中出现的新要求。它已在相应的issue中进行了讨论,可能仍会更改。

答案 1 :(得分:5)

添加

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

}

表示组件,因为dagger2不允许使用带范围模块的未范围组件

答案 2 :(得分:0)

看起来像是最新的Dagger-2版本中的一个错误: https://github.com/google/dagger/issues/107

相关问题