In HK2 the basic example code for configuring injection is this (within a class that extends AbstractBinder
:
bind(BuilderHelper
.link(FooImpl.class) // the class of the object to be injected
.to(FooInterface.class) // identifies what @Inject fields to link to
.build());
This causes HK2 to call the constructor FooImpl()
when it needs to create a FooInterface
.
What if FooImpl doesn't have a constructor?
FooImpl.getInstance()
fooFactory.create()
I see that ResourceConfig
has a method bind(FactoryDescriptors factoryDescriptors)
but it is not clear to me what the idiom is for building a FactoryDescriptors
object, and have not been able to find any examples online.
While I still can't see a way to do it using the BuilderHelper EDSL (it appears this is overkill for the common case too), the following works:
bindFactory(FooFactory.class)
.to(FooInterface.class);
This requires that FooFactory
is an implementation of Factory<FooInterface>
, so you need a facade around any existing factory you have. I did it as a private inner class where I needed it.
private static class FooFactory implements Factory<FooInterface> {
@Override
public void dispose(FooInterface foo) {
// meh
}
@Override
public FooInterface provide() {
return SomeFactory.getInstance();
}
}
Currently hk2 only supports the Factory interface for creating objects with special constructor needs. We have been considering adding a static method constructor or doing some sort of CDI @Produces type of mechanism. It is difficult to decide which of these things is worth the extra complexity (we try very hard to stay light-weight).
I think in your code example above your private static class needs to implement the Factory interface, right?
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