gpt4 book ai didi

java - GUICE - 在运行时决定对象图

转载 作者:行者123 更新时间:2023-12-04 05:08:24 24 4
gpt4 key购买 nike

我正在审查 Guice。假设我有以下设置:

public interface IsEmailer {...}
public interface IsSpellChecker {...}
public class Emailer implements IsEmailer {
@Inject
public class Emailer(final IsSpellChecker spellChecker)....
}
public class FrenchSpellChecker implements IsSpellChecker {....}
public class EnglishSpellChecker implements IsSpellChecker {....}
@BindingAnnotation public @interface English {}
@BindingAnnotation public @interface French {}

然后在我的模块中,我将接口(interface)绑定(bind)到它们各自的实现,并使用各自的绑定(bind)注释对拼写检查器进行注释。

现在,假设基于运行时变量,我需要构建一个使用英语或法语拼写检查器的电子邮件程序。

我想在我的模块中使用命名提供程序:
@Provides
@English
IsEmailer provideEnglishEmailer() {
return new Emailer(new EnglishSpellChecker());
}

@Provides
@French
IsEmailer provideFrenchEmailer() {
return new Emailer(new FrenchSpellChecker());
}

这像这样工作:
IsEmailer emailer = myModule.getInstance(Key.get(IsEmailer.class,
French.class));

这是做这种事情的最干净的方法吗?毕竟,我不得不手动(在提供程序中)构建对象。

谢谢

最佳答案

首先一些注意事项:

  • 通常你要避免使用 getInstance尽可能多的,除了你的“根”元素(例如 YourApplication )。在 Guice 提供的任何东西中,最好的办法是要求注入(inject) Provider<IsEmailer> , 或者 @English Provider<IsEmailer>@French Provider<IsEmailer> .在您调用 get 之前,Guice 不会真正创建元素。在 Provider ,因此创建 Provider 的开销很轻。
  • 您不必绑定(bind)到提供程序来获取提供程序。 Guice 将解决 X 的任何绑定(bind)。 , Provider<X> , 或 @Provides X任何注入(inject) XProvider<X>自动和透明。
  • Provider实现可以采用注入(inject)参数,@Provides 也可以。方法。
  • 如果要绑定(bind)很多东西到@English@French ,您也可以调查private modules , 因为这听起来像 "robot legs"我的问题。

  • 最简单的方法是使用第一个项目符号并注入(inject) Provider每个,特别是如果你只这样做一次。

    如果您的运行时变量可通过 Guice 访问,您也可以将其绑定(bind)到模块中。将其与 @Provides 一起放入您的模块中上面的注释。 (如前所述,您可能需要重写它们以分别接受 EnglishSpellCheckerFrenchSpellChecker 作为参数,以使拼写检查器能够注入(inject)它们自己的依赖项。)
    @Provides IsEmailer provideEmailer(Settings settings,
    @English Provider<IsEmailer> englishEmailer,
    @French Provider<IsEmailer> frenchEmailer) {
    if (settings.isEnglish()) {
    return englishEmailer.get();
    } else {
    return frenchEmailer.get();
    }
    }

    关于java - GUICE - 在运行时决定对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15214795/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com