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

克里斯·巴雷特(Chris Barrett)

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

据我了解,最好的方法是在您的主要方法中创建注入器,然后一次加载所有模块。

我不确定我打算在代码的其他地方使用这个注入器。我是否应该将其包装在单例类中并用

Injector injector = InjectorInstance.get();
ClassA obj = injector.getInstance(ClassA.class);

还是有我不知道的方法

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

我还找到了一个建议,可以传递提供程序,但是我不确定这比将实际数据结构传递到调用堆栈中有什么好处。

如果有人可以解释推荐的模式,或者更好地将我引导到一个使用guice的优秀开源项目的指导下,我将不胜感激!

杰夫·鲍曼

对于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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在应用程序中访问Play Framework 2.4 guice Injector?

如何从Guice的注射器中获取带注释的实例?

在Flask中:如何在Blueprint中访问应用程序记录器

如何在C ++应用程序中访问Java方法

在Web应用程序中获取Guice注射器

如何在带有WebAPI,WCF,SignalR和后台任务的MVC Web应用程序中配置简单的注射器容器和救生衣

如何在非Web应用程序中访问执行器端点

如何修复Angular 2中的“无法读取null的注射器属性”错误?

Angular 2:如何在应用程序中强制将可注射对象变成单例

Guice,无法创建注射器

Mobx注射器存储在React Native应用程序中不可用

如何使用Guice注射器创建对象?

如何在整个应用程序中“共享”代码段?

如何在src中布局我的Rust模块以在整个应用程序中进行访问

如何在整个应用程序中覆盖不同条目的渲染器?

如何在整个应用程序中访问一个文件的变量?

如何在NextJS应用程序中访问URL?

如何在整个DataGrid应用程序中更改SystemColors

如何在cakephp中定义可在整个应用程序中访问的变量?

AngularJS注射器

您如何在球拍服务器应用程序中访问获取参数

子模块的故障安全注射器。Google Guice中的可选绑定

如何在我的Ember应用程序中访问jsPDF?

如何在整个应用程序中访问配置对象?

如何在 swift 4 中访问应用程序委托中的视图控制器功能

vb.net 如何使程序扫描工作的注射器

无注射器guice注射

如何在 UMI 应用程序中访问 DVA Store?

如何在整个应用程序中访问 SharedPrefence 值?关闭应用程序后它的值变为空?