Java 如何从@Provides方法获取单例?

Java 如何从@Provides方法获取单例?,java,groovy,singleton,guice,Java,Groovy,Singleton,Guice,我有一个带有@的模块,提供了方法: class EnvironmentModule扩展了AbstractModule{ 静态串电流积 @凌驾 受保护的最终无效配置(){ } @提供 静态ProcessBuilder get(){ 返回当前产品==“Product1”?新产品1ProcessBuilder():新产品2ProcessBuilder() } 类,我将在其中插入ProcessBuilder: 类操作{ @注入 提供者进程生成器 无效操作(){ def process=processB

我有一个带有
@的模块,提供了
方法:

class EnvironmentModule扩展了AbstractModule{
静态串电流积
@凌驾
受保护的最终无效配置(){
}
@提供
静态ProcessBuilder get(){
返回当前产品==“Product1”?新产品1ProcessBuilder():新产品2ProcessBuilder()
}
类,我将在其中插入ProcessBuilder

类操作{
@注入
提供者进程生成器
无效操作(){
def process=processBuilder.get().build()
}
}
如何执行测试的步骤:

  • CURRENT\u PRODUCT='Product1'
  • operate()
    给我们提供prodcut1的实例,例如
    Product1ProcessBuilder@26aecf31
  • CURRENT\u PRODUCT='Product2'
  • operate()
    给我们提供prodcut2的实例,例如
    Product2ProcessBuilder@4bb4adf7
  • CURRENT\u PRODUCT='Product1'
  • operate()
    给我们提供prodcut1的实例,例如
    Product1ProcessBuilder@11544ddd
  • CURRENT\u PRODUCT='Product2'
  • operate()
    给我们提供prodcut2的实例,例如
    Product2ProcessBuilder@38e46ea
  • 如何在步骤2)、6)和4)、8)中获得相同的实例?

    当我用
    @Singleton
    注释
    @提供的
    方法时,它总是返回第一个返回产品的相同实例。
    
    当我用
    @Singleton
    注释每个类产品时,每次我都有另一个产品。

    只需再配置一点,您就可以做您想做的事情:

    @Provides @Singleton @Named("Product1")
    static ProcessBuilder provideProduct1ProcessBuilder() {
      return new Product1ProcessBuilder();
    }
    
    @Provides @Singleton @Named("Product2")
    static ProcessBuilder provideProduct2ProcessBuilder() {
      return new Product2ProcessBuilder();
    }
    
    static String CURRENT_PRODUCT;
    
    @Provides static ProcessBuilder get(
        @Named("Product1") ProcessBuilder product1ProcessBuilder,
        @Named("Product2") ProcessBuilder product2ProcessBuilder) {
      // Note the absence of @Singleton
      return "Product1".equals(CURRENT_PRODUCT) ? product1ProcessBuilder : product2ProcessBuilder;
    }
    

    在EnvironmentModule类中,get()方法应为:

     @Provides
        static ProcessBuilder get(Product1ProcessBuilder product1CommonBorrowOperations, Product2ProcessBuilder product2CommonBorrowOperations) {
            return CURRENT_PRODUCT == 'Product1' ? product1CommonBorrowOperations : product2CommonBorrowOperations
        }
    

    您的类Product1ProcessBuilder和Product2ProcessBuilder也应该使用@Singleton进行注释,以便在步骤2)、6)和4)、8)中获得相同的实例。

    我不是Guice专家,但我假设它与其他注入框架一样工作,也就是说,您可以使用限定符(例如作为注释)或
    get()的参数
    方法。或者,与您的情况一样,您可以基于类似您的逻辑返回实例(请记住,您不应该使用
    ==
    比较字符串)并且只需返回相同的实例和相同的字符串。您当前正在创建新实例-因此您可能希望总体上了解singleton模式。感谢您的回复。我知道,目前,我正在创建新实例,但正如我在底部所写的,我尝试了一些选项,但仍然无法使用
    new
    绕过注入框架。您需要在
    get()
    中查找
    Product1ProcessBuilder
    等以获取单例实例(首选选项),或者创建一次实例并返回它们(查看.如前所述,我更喜欢选项1,因为这样您就可以使用
    @Singleton
    ,字符串将被用作查找
    Product1ProcessBuilder
    Product2ProcessBuilder
    的开关。选项1非常适合我,感谢您的建议,我将尝试它!@Thomas直接使用Guice完全可行。请看我的答案。
    新的
    并没有绕过注入框架,因为它是在
    @提供的
    方法中完成的,该方法专门用于定制实例的构造。非常感谢!它为我提供了你的答案!但是它看起来有点复杂,这里有一个更简单的解决方案,它与和另一个一样…那么你认为这里有什么复杂的地方呢?它只是更标准的GUI,因为它在任何地方都使用提供程序方法,而不是混合定义,这会混淆代码读者。