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

时间:2016-05-17 12:36:58

标签: java dependency-injection guice

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

即。 区别:

@Inject SomeClass someObjcet;

VS

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

1 个答案:

答案 0 :(得分:7)

您可能希望注入Provider<T>而不仅仅是注入T(请参阅Guice's documentation)有三种不同的原因:

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