Guice提供者方法是否符合范围?

时间:2013-02-09 13:43:04

标签: java dependency-injection singleton 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());
    }
}

每次Guice使用providesAppleprovidesBosse分别注入AnAppleOfGoldBosse个对象时,他们是否会获得相同的Fizz单例实例?换句话说,Guice是否尊重范围之间提供方法,还是仅仅从模块的“外部”(DI客户端代码)中尊重范围(在本例中为Scopes.SINGLETON)?提前谢谢。

1 个答案:

答案 0 :(得分:5)

Guice将尊重@Provides方法之间的Singleton范围,,只要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());
}