将@Provides方法绑定为急切单例

时间:2014-03-03 13:16:20

标签: java guice

我想使用注释为@Provides的方法将绑定创建为一个热切的单例。我找到bug 216,这表明这是不可能的,但没有明确提及@Provides注释。

我目前有一个课程要求eager单身人士及时成为单身人士,但这不是一个很好的解决方案。

public class LogicModule extends AbstractModule {
    @Override public void configure() {
        bind(SomeDep.class);
        bind(MyWorkaround.class).asEagerSingleton();
    }

    // cannot add eager requirement here
    @Provides @Singleton Logic createLogic(SomeDep dep) {
        return LogicCreator.create(dep);
    }

    private static class MyWorkaround {
        @Inject Logic logic;
    }
}

我是否可以更改评论附近会使解决方法类过时的内容?

1 个答案:

答案 0 :(得分:11)

为什么不使用

bind(Logic.class).toInstance(LogicCreator.create(dep)); 
//ohh we missing dep

然后我们可以做到这一点

class LogicProvider implements Provider<Logic> {

    private final SomeDep dep;

    @Inject
    public LogicProvider(SomeDep dep) {
      this.dep = dep;
    }

    @Override
    public Logic get() {
      return LogicCreator.create(dep);
    }

}

然后

bind(Logic.class).toProvider(LogicProvider.class).asEagerSingleton();

您甚至可以SomeDep depProvider<SomeDep>传递给您的提供商,然后在providerDep.get()中致电LogicCreator.create(),这会更加强大。