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,因为它在任何地方都使用提供程序方法,而不是混合定义,这会混淆代码读者。