为什么使用Guice Provider而不是正常注入

Oba*_*oof 1 java dependency-injection guice

很抱歉提出愚蠢的问题,但我对Java和Guice框架很新.我无法理解Guice Provider类的使用,它提供了正常注入实例的任何压缩类的实例.据我所知,它允许您创建一个类的多个实例,其中Injected实例始终是Singleton.这是唯一的区别还是还有什么呢?

即区别:

@Inject SomeClass someObjcet;

VS

@Inject Provider<SomeClass> provider; provider.get();

Rog*_*rio 9

您可能希望注入一个Provider<T>而不仅仅是注入的三个不同的原因T(请参阅Guice的文档):

  1. get()Provider实现中对方法的每次调用都会(通常)返回依赖项的新实例.当所述实例保持可变状态时,这将是有用的(否则,当从多个线程访问时,依赖类可能会遇到并发问题).
  2. 提供者允许延迟加载实例化成本高的依赖性.使用提供程序时,只有get()调用方法时才会创建对象,该方法由代码决定.
  3. 来自"更宽"范围(通常是全局单例)的依赖对象可以通过使用提供者来获取更窄范围的对象的实例.例如,它可以获取请求范围(或会话范围)User对象.

  • 我可以想到一个:4.)在循环依赖的情况下(A得到B注入,B得到A注入),提供者可以解决并行创建问题. (6认同)
  • 也许不像已经提到的 4 个原因那么重要,但是如果您“确实”需要将 Injector 本身注入组件中(例如,您正在构建某种框架),那么注入 Provider&lt;Injector&gt;` 是一种方法,这样,比直接注入`Injector`更快。 (2认同)