Java 带工厂的单件公寓

Java 带工厂的单件公寓,java,guice,Java,Guice,我对Guice很陌生,但我有一个我相信通常会这样创建的单例: @Provides @Singleton private SomeClass getSomeClass() { return someClassFactory(configuration); } 然而,我希望这是急切地初始化。当我删除@Singleton注释并尝试绑定(SomeClass.class).asagersingleton()时,会出现错误: 1) No implementation for SomeClass

我对Guice很陌生,但我有一个我相信通常会这样创建的单例:

@Provides
@Singleton
private SomeClass getSomeClass()
{
    return someClassFactory(configuration);
}
然而,我希望这是急切地初始化。当我删除
@Singleton
注释并尝试
绑定(SomeClass.class).asagersingleton()
时,会出现错误:

 1) No implementation for SomeClass was bound.
 2) A binding to SomeClass was already configured

如何提供使用参数或工厂构造的急切初始化的单例?

注释提供了一种为
SomeClass
配置绑定的单独方法;它与
绑定(SomeClass.class).asagersingleton()冲突

要修复它,您需要编写一个显式提供程序类,并使用
toProvider
绑定它:

class MyModule extends AbstractModule {

  private static class MyProvider implements Provider<SomeClass> {
    private final OtherStuff otherStuff;

    @Inject
    MyProvider(OtherStuff otherStuff) {
      // Inject constructor params if your @Provides method took arguments
      this.otherStuff = otherStuff;
    }

    public SomeClass get() {
      return new SomeClass(otherStuff);
    }
  }

  protected void configure() {
    bind(SomeClass.class).toProvider(MyProvider.class).asEagerSingleton();
  }
}
MyModule类扩展了AbstractModule{ 私有静态类MyProvider实现提供程序{ 私人最终其他材料其他材料; @注入 MyProvider(其他内容其他内容){ //如果@Provides方法采用参数,则注入构造函数参数 this.otherStuff=otherStuff; } 公共类get(){ 返回新的SomeClass(otherStuff); } } 受保护的void configure(){ bind(SomeClass.class).toProvider(MyProvider.class).asagersingleton(); } }
@提供的注释是为
SomeClass
配置绑定的一种单独方式;它与
绑定(SomeClass.class).asagersingleton()冲突

要修复它,您需要编写一个显式提供程序类,并使用
toProvider
绑定它:

class MyModule extends AbstractModule {

  private static class MyProvider implements Provider<SomeClass> {
    private final OtherStuff otherStuff;

    @Inject
    MyProvider(OtherStuff otherStuff) {
      // Inject constructor params if your @Provides method took arguments
      this.otherStuff = otherStuff;
    }

    public SomeClass get() {
      return new SomeClass(otherStuff);
    }
  }

  protected void configure() {
    bind(SomeClass.class).toProvider(MyProvider.class).asEagerSingleton();
  }
}
MyModule类扩展了AbstractModule{ 私有静态类MyProvider实现提供程序{ 私人最终其他材料其他材料; @注入 MyProvider(其他内容其他内容){ //如果@Provides方法采用参数,则注入构造函数参数 this.otherStuff=otherStuff; } 公共类get(){ 返回新的SomeClass(otherStuff); } } 受保护的void configure(){ bind(SomeClass.class).toProvider(MyProvider.class).asagersingleton(); } }