我刚刚开始使用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。在这种情况下,您可能需要使用getInstance
或getProvider
将其存放在静态字段中。Guice还可以通过requestStaticInjection帮助您完成此操作,这对于Guice的长期设计而言并不理想,但可以帮助您处理遗留代码或过渡到Guice。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句