2013-02-09 26 views
1

如果我有這樣一個模塊:做Guice提供者方法是否符合範圍?

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()); 
    } 
} 

每次吉斯使用providesAppleprovidesBosse分別注入AnAppleOfGoldBosse對象,他們究竟是怎麼菲斯同單實例?換句話說,Guice的榮譽範圍是否在之間提供了方法,還是僅僅從模塊的「外部」(DI客戶端代碼)承諾範圍(在本例中爲Scopes.SINGLETON)?提前致謝。

回答

4

Guice將會尊重單身人士範圍@Provides方法,,前提是Guice是稱他們爲的人。

在您的示例中,您手動調用providesFizz(),該工作方式與任何其他方法調用一樣。每次嘗試獲取新的AnAppleOfGoldBosse時,Guice都會注入一個新實例。同時,當您通過Guice請求Fizz時,它會創建一個單獨的新實例,並通過Guice注入每個Fizz返回相同的實例。

那麼您如何從其他@Provides方法訪問常見實例?簡單:Guice將inject all parameters on your @Provides method,包括FizzProvider<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()); 
} 
+0

Ahaaaa ...非常有趣。感謝您提供非常有用的答案! – IAmYourFaja 2013-02-11 16:37:23

相關問題