I want to make a binding using a method annotated with @Provides
into an eager singleton. I've found bug 216, which suggests this isn't possible, but doesn't mention the @Provides
annotation explicitly.
I currently have a class that requests the eager
singletons in time by itself being a singleton, but it's not a very nice solution.
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;
}
}
Can I change something near the comment that would make the workaround class obsolete?
Why not to use
bind(Logic.class).toInstance(LogicCreator.create(dep));
//ohh we missing dep
then we can do this
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);
}
}
and then
bind(Logic.class).toProvider(LogicProvider.class).asEagerSingleton();
You can even pass SomeDep dep
to your provider as Provider<SomeDep>
and then call providerDep.get()
in LogicCreator.create()
that would be a bit more robust.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With