Sometimes, you need to bind one instance to two interfaces in Guice, for example:
interface Foo { ... } interface Bar extends Foo { ... } class FooBarImpl implements Bar { ... }
Let’s imaging FooBarImpl
is a stateful bean which is saved in a session scope:
bind(Bar.class) .to(FooBarImpl.class) .in(Session.class);
This works when someone injects Bar
but injecting Foo
fails. There are two solutions for this: Bind Foo
to Bar
or use a provider method to transform the type.
Solution 1: Binding Interfaces
bind(Foo.class) .to(Bar.class);
This will use the mapping for Bar
to satisfy requests for Foo
.
Solution 2: Provider Method
Provider methods are a nice way to build complex objects from bound instances. In our case, we can map the types like so:
@Provides @Session public Foo fooProvider(Bar impl) { return impl; }
Note: These approaches will put two keys into your scope but they will point to the same instance.