0

我有一个用例,似乎从多个位置引用 Guice 注入器是唯一的解决方案——尽管通常不鼓励这样做。

我的应用程序构建在 Talend(一个开源 ETL 平台)之上。我的大部分实际应用程序都在由 Talend 组件调用的 Java 类中。这些组件包括我编写的 Java 片段,这些片段反过来又实例化/调用我的类。

现在我打算在我的 Java 类中使用 Guice,但我绝对无法将依赖项注入 Talend 组件(以便它们可用于 Java 片段)。相反,我需要实际创建这些依赖项。我希望至少让 Guice 控制实例化,这意味着new我可以实例化我的类(具有@Inject构造函数的类)而不是使用injector.getInstance. 反过来,这意味着我需要保留注入器,大概是使用一个老式的工厂来创建它并使其作为单例可用。

我只是看不到任何其他方法来处理这个问题,但也许我错过了一些东西。

4

2 回答 2

3

考虑静态注入。这仍然会在你的应用程序中隐藏对注入器的持久引用,但它会让你不必在代码中添加injector.getInstance(...)调用。无论如何,Injector如果你真的需要,你可以注射。

class TalendDependencyModule extends AbstractModule {
  @Override public void configure() {
    requestStaticInjection(ExtractorDependencies.class);
    requestStaticInjection(ProcessorDependencies.class);
  }
}

public class ExtractorDependencies {
  @Inject private static Provider<ParserService> parserServiceProvider;
  @Inject private static Provider<SomethingElse> somethingElseProvider;

  private ExtractorDependencies() { }

  static ParserService getParserService() {
    return parserServiceProvider.get();
  }

  /* ... */
}
于 2012-12-14T08:08:12.087 回答
0

我不知道您有多少 Talend 对象,但您可能需要考虑使用提供程序。例如,假设您有自己的类,希望 Guice 管理以下内容的创建:

public interface INotTalendControlled {}
public class NotTalendControlled implements INotTalendControlled {}

这将被添加到无法通过 Guice 注入其依赖项的 Talend 对象中(尽管我假设有一些手动过程来执行此操作,无论是构造函数还是设置器):

public class TalendControlled {
        private INotTalendControlled notTalendControlled;

        private TalendControlled(INotTalendControlled notTalendControlled) {
            this.notTalendControlled = notTalendControlled;
        }

        public INotTalendControlled getValue() {
            return notTalendControlled;
        }
    }

如果您希望 Guice 管理这些生命周期和 Talend 控制对象的生命周期,您可以使用如下提供程序:

public static class TestModule extends AbstractModule {
            @Override
            protected void configure() {
                bind(INotTalendControlled.class).to(NotTalendControlled.class);
            }

            @Provides
            public TalendControlled provideInjectsToTalendObject(INotTalendControlled notTalendControlled) {
                return new TalendControlled(notTalendControlled);
            }
        }

@Provides 方法将对所有对象隐藏 new 的使用,因为您现在可以直接注入 TalendControlled 对象 (@Inject TalenControlled talendControlled),并且不需要显式注入器来构造它们的依赖项。

于 2012-12-14T14:41:50.320 回答