将@Provides方法绑定为预先单例

2022-09-03 02:08:42

我想使用带注释的方法将 绑定到一个热切的单例中。我发现了错误216,这表明这是不可能的,但没有明确提到注释。@Provides@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

为什么不使用

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()


答案 2

推荐