当前位置: 首页 > 面试题库 >

如何在Google Guice中实现“机器人腿”用例?

陈铭晨
2023-03-14
问题内容

我正在学习Google Guice。您知道如何解决“机器人腿”问题吗?让我用一个例子解释一下。

假设我有一个叫做的类Service

@Singleton
public class Service {
    @Inject
    Source source;

}

该接口Source有两种实现:

public class SourceDatabase implements Source {

}

public class SourceFileSystem implements Source {

}

我的模块是这样实现的:

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Service.class).asEagerSingleton();
    }
}

好吧,我想知道这是否可能:

public class MainClass {

    @Inject @SomeAnnotation("database")
    Service serviceWithADatabaseSource;

    @Inject @SomeAnnotation("file-system")
    Service serviceWithAFileSystemSource;

}

是否存在一些让我做到这一点的注释或绑定,让我对like这样的成员进行注释serviceWithADatabaseSource,这有助于Guice知道应该向内部source注入SourceDatabase实现?

编辑: 感谢丹尼尔·马丁(Daniel Martin)在他的评论中给我们提供了此类问题的名称。


问题答案:

如Guice
Wiki中所述
,您需要安装两个PrivateModule,每个都为您提供带有正确注释的Service。

public class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    install(new PrivateModule() {
      @Override public void configure() {
        // Bind Source to SourceDatabase.
        bind(Source.class).to(SourceDatabase.class);
        // Bind @Named("database") Service to Service.
        bind(Service.class).annotatedWith(Names.named("database"))
            .to(Service.class);
        // Now expose @Named("database") Service without exposing
        // either of the other two conflicting bindings.
        expose(Service.class).annotatedWith(Names.named("database"));
      }
    });
    install(new PrivateModule() {
      @Override public void configure() {
        // Same as above.
        bind(Source.class).to(SourceFileSystem.class);
        bind(Service.class).annotatedWith(Names.named("file-system"))
            .to(Service.class);
        expose(Service.class).annotatedWith(Names.named("file-system"));
      }
    });
  }
}

如果模块不是PrivateModule实例,则到Source和Service的那些绑定将相互冲突。但是,每个绑定取而代之的是从Injector继承所有公共绑定,而仅将In暴露@Named(...) Service给外部世界。这样,相同的Service实现可以注入相同的未注释Source但返回不同的完全注入类型。

另请注意,由于您尚未在任何非私有模块中建立绑定,因此您将无法在PrivateModules之外请求SourceService(没有注释)。这应该是预期:该PrivateModule绑定不应该与任何公开的绑定冲突,并没有通过PrivateModule的暴露绑定一个进入,吉斯不知道哪个SourceService返回。

最后,考虑到Module实例可以使用构造函数参数,将两个匿名内部PrivateModules提取为命名的等效项可能是一个好主意:

public class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    install(new SourcePrivateModule(SourceDatabase.class, "database"));
    install(new SourcePrivateModule(SourceFileSystem.class, "file-system"));
  }
}


 类似资料:
  • 本文向大家介绍Python如何实现机器人聊天,包括了Python如何实现机器人聊天的使用技巧和注意事项,需要的朋友参考一下 今天午休的时候,无意之中看了一篇博客,名字叫Python实现机器人,感觉挺有的意思的。 于是用其写了一个简单的Python聊天,源码如下所示: 注意:如果出现某某模块找不到的时候,记得使用pip安装对应的模块。 效果图如下所示: 唯一美中不足的是英文,不过没关系,国内有图灵机

  • 你好,我是一个新的初级测试软件,我被要求学习X射线和机器人框架,以及如何实现两者。 在我开始学习机器人框架之后,我用X射线做了一些测试用例,直到一切都很好。 现在我一直在尝试实施我在机器人上做的测试案例的结果到X射线中的测试执行,但每次我尝试将output.xml从机器人导入X射线而不是“同步”这个测试X射线创造了我新的测试关心机器人的结果。 有没有人以前做过这件事可以帮我?我曾尝试在robot中

  • 群主/管理员在企业群中,点击机器人图标打开机器人面板,进入添加机器人列表。1个群最多只能添加10个机器人。 详细请参阅:在客户端使用机器人 机器人添加入口:

  • R2DBC目前不支持复合键。我想知道我们现在如何实现多对多关系? 例如,给定两个实体: 以及它们的模式: 我可以为多对多映射创建一个表: 但是,我们应该如何在kotlin/java中定义映射类ItemTag? 或者省略可以吗?那么类就不能有任何?我想那很好。这是唯一的含义吗?

  • 我想用机器人框架实现selenium网格。我已经配置了selenium网格集线器和两个节点,但是我不知道如何在此设置后触发并行测试用例执行,在哪里使用python语言和selenium 2库关键字更新机器人框架中的线程数和并行测试执行设置?此外,在哪里分配集线器url来触发执行?请建议可能的解决方案。注意:我们在脚本中使用selenium 2库关键字,而不是web驱动程序关键字,因此我无法使用“w

  • 我一直试图在Android设备中添加一个机器人到我的电报组中,但我无法做到这一点。我尝试了@bot_name,/bot_name,但都不起作用。 是否可以添加一个bot到组中,或者我应该使用Telegram API(而不是bot API)创建一个新的bot,以便我可以将联系号码添加到组中?