[英]Do Guice provider methods honor scope?
如果我有這樣的模塊:
public class MyModule extends AbstractModule {
@Override
public void configure() {
bind(WhatsThis.class).to(AnAppleOfGold.class);
bind(TellMeYourName.class).to(Bosse.class);
}
@Provides
public AnAppleOfGold providesApple() {
return new AppleOfGold(providesFizz());
}
@Provides
public Bosse providesBosse() {
return new Bosse("Grab a hold of my beard", providesFizz());
}
@Provides @Singleton
public Fizz providesFizz() {
return new Fizz(Math.random());
}
}
每次吉斯使用providesApple
和providesBosse
注入AnAppleOfGold
和Bosse
分別為對象,他們究竟是怎么菲斯同單實例? 換句話說,Guice是否尊重提供方法之間的范圍,還是僅從模塊“外部”(DI客戶端代碼)尊重范圍(在這種情況下為Scopes.SINGLETON
)? 提前致謝。
Guice將尊重@Provides
方法之間的Singleton范圍, @Provides
是Guice是調用它們的方法 。
在您的示例中,您手動調用providesFizz()
,其工作方式與任何其他方法調用一樣。 每當您嘗試獲取新的AnAppleOfGold
或Bosse
時,Guice都會注入一個新實例。 同時,當您通過Guice請求Fizz
時,它將創建一個單獨的新實例,並為通過Guice注入的每個Fizz
返回相同的實例。
那么如何從其他@Provides
方法訪問公共實例? 簡單:Guice將在@Provides方法上注入所有參數 ,包括Fizz
或Provider<Fizz>
。
@Provides
public AnAppleOfGold providesApple(Fizz fizz) {
return new AppleOfGold(fizz);
}
@Provides
public Bosse providesBosse(Provider<Fizz> fizzProvider) {
return new Bosse("Grab a hold of my beard", fizzProvider.get());
}
@Provides @Singleton
public Fizz providesFizz() {
return new Fizz(Math.random());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.