2

如果我有这样的模块:

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 分别使用providesAppleandprovidesBosse注入AnAppleOfGoldBosse对象时,它们是否会得到相同的 Fizz 单例实例?换句话说,Guice 是否尊重提供方法之间的范围,还是仅尊重Scopes.SINGLETON来自模块“外部”(DI 客户端代码)的范围(在这种情况下,)?提前致谢。

4

1 回答 1

5

@ProvidesGuice 将尊重方法之间的 Singleton 范围,前提是 Guice 是调用它们的那个

在您的示例中,您providesFizz()手动调用,这与任何其他方法调用一样。每次您尝试获取新的AnAppleOfGoldBosse. 同时,当您通过 Guice 请求时,它将创建一个单独的新实例,并为每个通过 Guice 注入Fizz的实例返回相同的实例。Fizz

那么如何从其他@Provides方法访问公共实例呢?很简单:Guice 会在你的 @Provides 方法上注入所有参数,包括Fizzor 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());
}
于 2013-02-11T04:41:01.933 回答