如何配置HK2以注入工厂方法创建的对象?

时间:2013-11-21 14:17:15

标签: java dependency-injection hk2

在HK2中,配置注入的基本示例代码是这样的(在扩展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());

这会导致HK2在需要创建FooImpl()时调用构造函数FooInterface

如果FooImpl没有构造函数怎么办?

  • 如果要使用静态工厂方法FooImpl.getInstance()
  • 进行实例化,该怎么办?
  • 如果要通过工厂对象fooFactory.create()
  • 进行实例化,该怎么办?

我看到ResourceConfig有一个方法bind(FactoryDescriptors factoryDescriptors),但我不清楚构建FactoryDescriptors对象的成语是什么,并且无法在线找到任何示例。

2 个答案:

答案 0 :(得分:5)

虽然我仍然看不到使用BuilderHelper EDSL的方法(对于普通情况来说这似乎有点过分了),但以下工作:

  bindFactory(FooFactory.class)
       .to(FooInterface.class);

这要求FooFactoryFactory<FooInterface>的实现,因此您需要围绕现有工厂的外观。我把它作为一个私人的内部课,我需要它。

 private static class FooFactory implements Factory<FooInterface> {

    @Override
    public void dispose(FooInterface foo) {
      // meh
    }

    @Override
    public FooInterface provide() {
      return SomeFactory.getInstance();
    }
 }

答案 1 :(得分:2)

目前,hk2仅支持Factory接口,用于创建具有特殊构造函数需求的对象。我们一直在考虑添加静态方法构造函数或执行某种类型的CDI @Produces类型的机制。很难确定哪些东西值得额外的复杂性(我们非常努力保持轻量级)。

我认为在上面的代码示例中,您的私有静态类需要实现Factory接口,对吧?