【问题标题】:Lazy load of non-singleton in guiceguice中非单例的延迟加载
【发布时间】:2018-05-13 00:59:06
【问题描述】:

我在我的项目中使用 Guice for DI,并且我希望在我的类中对非单例对象进行延迟初始化。 我尝试使用Provider,但每次调用get() 方法时它都会返回新实例。

public class MyClass {
  @Inject
  private Provider<Service> serviceProvider; //Service is NOT Singleton

  public void meth1() {
    Service s1 = serviceProvider.get();       
  }

  public void meth2() {
    Service s2 = serviceProvider.get();
  }
  //I want  s1 and s2 to be the same object
}

Guice 能做到吗,还是有其他做法可以做到这一点?

【问题讨论】:

  • “我希望 s 和 s2 是同一个对象” - 为什么?如果它们是对同一实例的 2 个引用,那么为什么首先需要 2 个引用?
  • 为什么不这样做:Service s2 = s;? “惰性注入”是什么意思?
  • 我编辑消息。希望现在我的意思更明确
  • Suppliers.memoize(serviceProvider::get)

标签: java dependency-injection guice provider


【解决方案1】:

如果你需要s1s2 来引用同一个实例,那么你只需要一个Service 的实例来作为MyClass 的实例,并且它简单地解析为一个实例字段:

public class MyClass {

  @Inject
  private Provider<Service> serviceProvider;

  private Service service;

  public void meth1() {
    if (this.service == null) this.service = this.serviceProvider.get();
    // use service 
  }

  public void meth2() {
    if (this.service == null) this.service = this.serviceProvider.get();
    // use service 
  }
}

【讨论】:

  • 但这并不是Service的懒惰初始化。我希望服务仅在 meth1 或 meth2 初始化。
  • 我已经更新了答案以满足您的要求,但并不是说这种方法不是最佳方法,特别是不是线程安全的。
【解决方案2】:

正如 Tavian 在 cmets 中提到的,最好的解决方案是 Suppliers.memoize(serviceProvider::get),或类似的。 Suppliers(和 Supplier)在 Google 实用程序库 Guava 中,从 Java 8 开始,Guava 的 Supplier 扩展了 Java 8 的功能接口 Supplier,尽管 Java 8 不提供与 Suppliers 等效的内置功能。 serviceProvider::get 的规范对于使 Provider 表现为没有显式适配器的供应商是必要的,即使它们都指定了一个方法,即零参数 T get()

与 Google 的其他 DI 框架 Dagger 不同,Supplier 没有 Lazy 类来提供您正在寻找的本地记忆。尽管您可以执行 tmarwen 在 their updated answer 中提供的那种“检查然后设置”行为,但该策略(如他们的评论中所述)不是线程安全的,而 Suppliers.memoize 是明确的线程安全的。

虽然 Guava 提供了很多有用的功能,但您可能不想为单个方法添加一个全新的库。如果您确实需要没有完整库的线程安全,可以查看the Apache-licensed implementation here

【讨论】:

  • 所以,Guice 没有从盒子中提供这个功能,但是很容易使用 Guava 的供应商。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2017-03-22
  • 2015-06-21
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多