I have a Module
that requires some arbitrary Depedency
. Is there a way Modules themselves can be injected? I realize this is a bit of a chicken and egg situation...
Example:
public class MyModule implements Module {
private final Dependency d;
@Inject public MyModule(Dependency d) {
this.d = d;
}
public void configure(Binder b) { }
@Provides Something provideSomething() {
return new SomethingImpl(d);
}
}
I suppose in this case the solution would be to turn the @Provides
method into a full-fledged Provider<Something>
class. This is clearly a simplified example; the code I'm dealing with has many such @Provides
methods so cutting them each into individual Provider<...>
classes and introducing a module to configure them adds a fair amount of clutter - and I thought Guice was all about reducing boilerplate?
Perhaps it's a reflection of my relative noobyness to Guice but I've come across a fair few cases where I've been tempted to do the above. I must be missing something...
@Provides
methods can take dependencies as parameters just like parameters to an @Inject
annotated constructor or method:
@Provides Something provideSomething(Dependency d) {
return new Something(d); // or whatever
}
This is documented here, though perhaps it could be made to stand out more.