Search code examples
javadependency-injectionhk2

How do I configure HK2 to inject an object created by a factory method?


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?

  • What if it's intended to be instantiated with a static factory method FooImpl.getInstance()
  • What if it's intented to be instantiated by a factory object 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.


Solution

  • 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();
        }
     }