Java 具有混合作用域的Dagger2模

Java 具有混合作用域的Dagger2模,java,dependency-injection,scope,dagger,dagger-2,Java,Dependency Injection,Scope,Dagger,Dagger 2,我目前正在尝试使用子组件使用自定义范围设置dagger2,但dagger编译器遇到了一些问题。更具体地说,我有以下设置: @Qualifier @interface Foo {} @Qualifier @interface Baz {} @Scope @interface SomeScope {} @Module static class Amodule { @Provides @SomeScope @Foo String provideFo

我目前正在尝试使用子组件使用自定义范围设置dagger2,但dagger编译器遇到了一些问题。更具体地说,我有以下设置:

  @Qualifier @interface Foo {}
  @Qualifier @interface Baz {}
  @Scope @interface SomeScope {}

  @Module
  static class Amodule {
    @Provides
    @SomeScope
    @Foo
    String provideFoo(@Baz String baz) {
      return "foo" + baz;
    }

    @Provides
    @Baz
    String provideBaz() {
      return "baz";
    }
  }

  @Component(modules = Amodule.class)
  interface Acomponent {  
    @Baz String baz();
    Subcomp subcomp();
  }

  @SomeScope
  @Subcomponent
  interface Subcomp {
    @Foo String foo();
  }
不幸的是,这给了我一个错误:

Acomponent (unscoped) may not reference scoped bindings:
  @Component(modules = AModule.class)
  ^
      @Provides @SomeScope @Foo String Amodule.provideFoo(@Baz String)
通过将所有自定义范围绑定拆分为一个单独的模块,我成功地实现了这些功能,但我不确定为什么上面的设置不可能实现。此外,在我的例子中,Foo和Baz对象是密切相关的,因此如果可以避免的话,我不希望将它们分割成单独的模块

有人能解释一下为什么dagger编译器不接受上面的例子吗?似乎在
@SomeScope
子组件中应该是一个有效的位置来公开
@Foo
的绑定。我是不是误解了什么,或者这可能是对codegen工作方式的限制


谢谢

您遇到的错误与您的子组件没有任何关系

您需要将
a组件设置为
@SomeScope
。不能提供与非作用域组件不同的作用域。各国:

由于Dagger 2将图中的作用域实例与组件实现的实例相关联,因此组件本身需要声明它们要表示的作用域。例如,在同一组件中使用@Singleton绑定和@RequestScope绑定没有任何意义,因为这些范围具有不同的生命周期,因此必须位于具有不同生命周期的组件中

添加范围,这应该会起作用

@SomeScope
@Component(modules = Amodule.class)
interface Acomponent {  
    @Baz String baz();
    Subcomp subcomp();
}

非常感谢您的回复。然而,我想知道的是,这是如何推广到多个作用域的?我这样问是因为在我的真实示例中,我希望组件也@Provide singleton作用域绑定。另外,我不太确定我的原始示例与文档有何矛盾:组件是非作用域的,只提供非作用域(或单例)绑定,子组件是
@SomeScope
,提供所有
@SomeScope
绑定。@简言之,非作用域组件不能有作用域模块。如果要提供
@Singleton
,则必须对组件应用相同的作用域。我不知道如果我想使用Singleton scope和SomeScope,我必须将不同作用域的
@提供的
方法拆分为不同的模块。现在还不清楚为什么这在实现方面是必要的,但我想这就是事实:/@Dino请参阅文档中的引用:他们希望您在不同的范围内拥有不同的生命周期:)是的,如果模块处理生命周期,那么这是有意义的。我想我最初希望组件能够处理生命周期,这会给Subcomp带来一些希望,让它能够管理
@Foo
生命周期,即使从技术上讲,模块是添加到其父组件中的。