How to bind one implementation to a few interfaces with Google Guice?
I need to bind one class as implementation of two interfaces. And it should be binded in a singleton scope.
What I've done:
bind(FirstSettings.class).
to(De开发者_如何学PythonfaultSettings.class).
in(Singleton.class);
bind(SecondSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
But, obviously, it leads to creation of two different instances, because they are binded to the different keys.
My question is how can I do that?
Guice's wiki has a documentation about this use case.
Basically, this is what you should do:
// Declare that the provider of DefaultSettings is a singleton
bind(DefaultSettings.class).in(Singleton.class);
// Bind the providers of the interfaces FirstSettings and SecondSettings
// to the provider of DefaultSettings (which is a singleton as defined above)
bind(FirstSettings.class).to(DefaultSettings.class);
bind(SecondSettings.class).to(DefaultSettings.class);
There is no need to specify any additional classes: just think in terms of Provider
s and the answer comes rather naturally.
The solution, I've found is:
bind(FirstSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
bind(SecondSettings.class).
to(FirstSettings.class).
in(Singleton.class);
It works in my case, because SecondSettings extends FirstSettings.
So, DefaultSettings
is an implementation of both the FirstSettings
and SecondSettings
, ie:
public class DefaultSettings implements FirstSettings, SecondSettings
{
}
Let's say you have a class EngineA
and EngineB
public class EngineA
{
@Inject
private FirstSettings settings;
}
public class EngineB
{
@Inject
private SecondSettings settings;
}
and you would like to inject the same implementation.
You can declare an interface DefaultSettingsInterface
public interface DefaultSettingsInterface extends FirstSettings, SecondSettings
{
}
and make the DefaultSettings
implement DefaultSettingsInterface
public class DefaultSettings implements DefaultSettingsInterface
{
}
Then the configuration may be:
bind(FirstSettings.class).to(DefaultSettingsInterface.class);
bind(SecondSettings.class).to(DefaultSettingInterface.class);
bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class);
精彩评论