Guice提供者方法遵守范围吗?

IAm*_*aja 2 java singleton dependency-injection 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

每次Guice分别使用providesAppleprovidesBosse注入AnAppleOfGoldBosse对象时,它们是否都获得Fizz的相同单例实例?换句话说,Guice是否支持提供方法之间的范围,还是仅从Scopes.SINGLETON模块“外部”(DI客户端代码)支持范围(在这种情况下为)?提前致谢。

Jef*_*ica 5

Guice将尊重@Provides方法之间的Singleton范围,只要Guice是调用它们的人即可

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

那么,如何从其他@Provides方法访问公共实例呢?简单:Guice会将所有参数注入@Provides方法中,包括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());
}
Run Code Online (Sandbox Code Playgroud)