如何在整个应用程序中访问Guice注入器

时间:2014-06-20 23:18:30

标签: java guice thrift

我刚刚开始使用Guice,在阅读了文档后,浏览了几本书并观看了2009年的Google I / O演讲,我试图转换一个依赖于一些全球数据的节俭项目结构。目前,他们在thrift服务器启动时创建并在每个请求上传递给处理程序。它们也用在代码的每个部分!本质上是单身人士。

据我了解,在主方法中创建进样器并将所有模块加载一次是最佳做法。

我不确定我的意思是如何在我的代码中的其他位置使用此注入器。我应该将它包装在单例类中并使用

丢弃我的代码
Injector injector = InjectorInstance.get();
ClassA obj = injector.getInstance(ClassA.class);

或者有一种我不了解的方法

ClassA obj = Guice.getLastInjector().getInstance(ClassA.class);

我还建议传递提供商,但我不确定这比将实际数据结构传递到调用堆栈更好。

如果有人能够解释推荐的模式,或者更好地向我发送一个使用guice的开源项目的方向,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

对于Guice,我们的想法是你有一个完整的依赖图,每个依赖都会在其生命周期内引用它所需的东西:

class EntryPoint {
  public static void main(String[] args) {
    YourApp yourApp = Guice.createInjector(yourListOfModules())
        .getInstance(YourApp.class);
    yourApp.run();
  }
}

class YourApp {
  @Inject DependencyA dependencyA;
}

class DependencyA {
  @Inject DependencyB dependencyB;
}

class DependencyB {
  /** This is injected once, so you'll always only get the same instance. */
  @Inject DependencyC dependencyC;
  /** By injecting the provider, you can get multiple instances. */
  @Inject Provider<DependencyD> dependencyD;
}

Guice负责管道工作,因此YourApp和DependencyA不必担心DependencyB是否需要DependencyC或DependencyD。从这个意义上说,你永远不会调用new:Guice负责为你创建每个@Inject ed依赖项,然后提供它的依赖项。

如果您还没有检测到依赖关系(即您仍然在代码中调用new),那么您将无法再从手动构建的类中访问Injector。在这种情况下,您可能需要使用getInstancegetProvider并将其存放在静态字段中。 Guice还将帮助您使用requestStaticInjection来完成此操作,这对于长期Guice设计不是很好,但可以帮助您使用遗留代码或过渡到Guice。