【问题标题】:How do I configure HK2 to inject an object created by a factory method?如何配置 HK2 以注入由工厂方法创建的对象?
【发布时间】:2013-11-21 14:17:15
【问题描述】:

在 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 在需要创建 FooInterface 时调用构造函数 FooImpl()

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

  • 如果打算使用静态工厂方法FooImpl.getInstance() 进行实例化怎么办?
  • 如果它打算被工厂对象实例化怎么办fooFactory.create()

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

【问题讨论】:

    标签: java dependency-injection hk2


    【解决方案1】:

    虽然我仍然看不到使用 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();
        }
     }
    

    【讨论】:

    • 如果它是一个没有实现任何接口的第三方类怎么办? IE。只有Foo,没有FooInterface
    【解决方案2】:

    目前 hk2 只支持 Factory 接口来创建具有特殊构造函数需求的对象。我们一直在考虑添加一个静态方法构造函数或做某种 CDI @Produces 类型的机制。很难决定哪些事情值得额外的复杂性(我们努力保持轻量级)。

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

    【讨论】:

    • FWIW 我觉得这很好,但 HK2 文档需要一些使用示例。
    • 我已添加此错误java.net/jira/browse/HK2-167 以跟踪添加更多有关工厂的示例。其他人在工厂使用 EDSL 时也遇到过问题,所以我认为这是一个常见问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多