gpt4 book ai didi

java - guice中非单例的延迟加载

转载 作者:行者123 更新时间:2023-11-30 02:18:31 25 4
gpt4 key购买 nike

我在我的项目中使用 Guice 进行 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 可以做到吗?或者还有其他实践可以实现这一目标吗?

最佳答案

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

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

尽管 Guava 提供了许多有用的功能,但您可能不想为单个方法添加全新的库。如果你确实需要线程安全而不需要完整的库,你可以看看 the Apache-licensed implementation here .

关于java - guice中非单例的延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com