动态依赖注入

时间:2013-07-16 15:01:37

标签: java dynamic dependency-injection guice guice-3

我想实现DYNAMIC依赖注入。 GUICE支持这个吗?如果没有,你能推荐任何其他DI框架吗?

必须在运行期间确定应通过@Inject进行注入的实现,例如通过与用户的互动。

与这些问题相似: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html

谢谢

2 个答案:

答案 0 :(得分:1)

实现需要根据输入而变化,在某些时候你将不得不将输入解析为某种类。

如果您希望该映射生效在Guice中,那么您基本上可以根据参数获取实现,该参数映射到the SO question I just answered here。您可以编写一个小的可注入类来获取输入并返回完全注入的实现。

如果您已经拥有该映射并且在变量中具有(例如)类文字,那么您只需inject an Injector directly并询问其实现。

class YourClass {
  @Inject Injector injector;

  SomeInterface yourMethod(String input) {
    Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
    return injector.getInstance(clazz);
  }

  Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
    // Implement this as needed.
    return SomeInstance.class;
  }
}

请注意,虽然您总是可以注入一个Injector,但是当您真的不知道需要什么样的实现时(例如此处),您应该这样做。一般情况下,如果要延迟创建,则应注入SomeInstance本身或Provider<SomeInstance>

答案 1 :(得分:0)

我们曾经有类似的要求,所以我们做的是使用工厂模式,并使用spring在工厂类实现中添加所有实现。

这样,在运行时我们会知道要使用哪个实现,我们会调用我的工厂来提供实现类。

此外,只要您有更多实施,您就可以更新工厂类的弹簧配置。

这可能与你想到的设计不太接近,但这解决了我们的目的。

干杯!!