为什么要使用Guice Provider而不是普通的注入

4

很抱歉问一个愚蠢的问题,但我对Java和Guice框架还是很新。我无法理解Guice Provider类的用途,该类提供了任何类的实例,与正常注入的实例相比具有压缩功能。据我所知,它允许您创建类的多个实例,而注入的实例始终是单例模式。这是唯一的区别还是还有其他区别?

例如:

@Inject SomeClass someObjcet;

VS

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


1
Guice会为您注入实例。 - Sleiman Jneidi
而且 provider.get() 也会给你实例。那么这只是实例化对象的两种不同方式吗? - Obaid Maroof
你是指@Provides方法和实现Provider<T>(https://github.com/google/guice/wiki/ProviderBindings)之间的区别吗? - zapl
@zapl 我的意思是 Provider<T>@Inject 的区别。我已经编辑了问题以使其更清晰。 - Obaid Maroof
你想使用 https://github.com/google/guice/wiki/InjectingProviders 吗?还是你想手动创建提供者而不是注入它? - zapl
@Inject 受保护的Provider<Scan> scanProvider;vs@Inject 受保护的Scan; - Obaid Maroof
1个回答

18

有三个不同的原因,你可能想要注入一个 Provider<T> 而不是仅仅注入 T(请参见 Guice 文档):

  1. Provider 实现中每次调用 get() 方法将(通常)返回依赖项的一个新实例。当这些实例持有可变状态时,这将非常有用(否则,当从多个线程访问时,依赖类可能会遇到并发问题)。
  2. 使用提供程序可以实现对代价高昂的依赖项进行延迟加载。通过提供程序,只有在调用 get() 方法时才会创建对象,这由您的代码决定。
  3. 通过使用提供程序,来自“更广泛”范围的依赖对象(通常为全局单例)可以获取较窄范围对象的实例。例如,它可以获取请求范围(或会话范围)的 User 对象。

9
我能想到一个例子:4.) 在出现循环依赖(A获取注入B,B获取注入A)的情况下,使用提供程序可以解决并行创建问题。 - Jan Galinski
2
也许不像已经提到的4个原因那么重要,但是如果你真的需要在组件中注入Injector本身(例如,你正在构建某种框架),那么注入Provider<Injector>比直接注入Injector要快得多。 - electrotype

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接