我刚刚开始使用Guice,在阅读了文档后,浏览了几本书并观看了2009年的Google I / O演讲,我试图转换一个依赖于一些全球数据的节俭项目结构。目前,他们在thrift服务器启动时创建并在每个请求上传递给处理程序。它们也用在代码的每个部分!本质上是单身人士。
据我了解,在主方法中创建进样器并将所有模块加载一次是最佳做法。
我不确定我的意思是如何在我的代码中的其他位置使用此注入器。我应该将它包装在单例类中并使用
丢弃我的代码Injector injector = InjectorInstance.get();
ClassA obj = injector.getInstance(ClassA.class);
或者有一种我不了解的方法
ClassA obj = Guice.getLastInjector().getInstance(ClassA.class);
我还建议传递提供商,但我不确定这比将实际数据结构传递到调用堆栈更好。
如果有人能够解释推荐的模式,或者更好地向我发送一个使用guice的开源项目的方向,我将不胜感激!
答案 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。在这种情况下,您可能需要使用getInstance
或getProvider
并将其存放在静态字段中。 Guice还将帮助您使用requestStaticInjection来完成此操作,这对于长期Guice设计不是很好,但可以帮助您使用遗留代码或过渡到Guice。