2013-02-09 59 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

相关问题