当前位置: 首页 > 知识库问答 >
问题:

Guice 中某个类的多个提供程序

习阳
2023-03-14

我有一个Guice,它的构造函数接受注入的参数:

@Singleton
public class MyClass {
    private MyConfiguration myConfiguration;

    @Inject
    public MyClass(MyConfiguration myConfiguration) {
        this.myConfiguration = myConfiguration;
    }
}

现在,我希望能够注入参数取决于我运行此参数的环境。在测试中,我想注入一个 MyConfiguration 对象,而在生产中,我想注入另一个对象。

我有两个MyConfiguration提供程序。MyConfigurationProvider读取外部配置文件并从那里获取配置。MyConfigurationTestProvider只是对所有设置进行硬编码。

我不知道如何配置它。我试图在Guice模块中做一个绑定,比如:

public class MyGuiceModule extends AbstractModule {
    @Override
    protected void configure() {
       bind(MyConfiguration.class).toProvider(MyConfigurationProvider.class).in(Singleton.class);
    }
}

在测试的Guice模块中,使用:

public class MyGuiceTestModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new MyGuiceModule());
        bind(MyConfiguration.class).toProvider(MyConfigurationTestProvider.class).in(Singleton.class);
    }
}

但是这给了我一个绑定多个提供者的错误。

我的问题是,如何为同一对象使用不同的提供程序取决于环境?

非常感谢。

共有1个答案

轩辕乐邦
2023-03-14

是的,默认情况下,Guice模块不能包含具有相同键的多个绑定。但是,在创建进样器时,可以使用模块的覆盖功能。该功能正是为此目的而设计的。

从您测试模块中删除< code>install()内容,并为您的测试环境创建一个注入器,如下所示:

Injector injector = Guice.createInjector(Modules.override(new MyGuiceModule()).with(new MyGuiceTestModule()));

这样,测试模块中的< code>MyConfiguration绑定将替换生产模块中的绑定。

 类似资料:
  • 我需要一个关于如何使用Google-guice为服务的多个实现编写代码的建议。下面是示例 因为Guice不允许将一个类型绑定到多个实现,因为下面的代码会导致错误 我们可以用下面的命名注释来解决这个问题 但我工作的应用程序是这样的。我们在init()方法中绑定所有模块并创建注入器模块: 但是通过上述过程,我可以将一个实现类绑定到接口(服务类) 你能给我提供一个方法来与供应商合作吗。我想在下面这样做

  • 问题内容: 我有一个包含20个左右注释实现的接口。如果知道在编译时需要的内容,则可以注入正确的内容,但是现在我需要根据运行时参数动态注入内容。 据我了解的文档,我将不得不使用20次左右的注射,然后再使用所需的注射,这对我来说似乎太过分了。有没有一种方法可以绑定特定的实现,然后仅将其注入我的类中? 问题答案: 注入一个[MapBinder](https://google.github.io/guic

  • 问题内容: 我正在做一个很大的项目,有很多注入。当前,我们正在使用一个类,该类为需要一次的每次注入实现,并且它们大多具有一个行方法。 每当我需要一个新的提供程序时,创建一个新的类就变得很烦人。使用提供程序类比使用方法有什么好处,反之亦然? 问题答案: 据我所知,它们在大多数简单情况下是完全等效的。 无论哪种样式,即使键绑定到类或实例,Guice都可以让您注入和。如果直接获取实例,Guice会自动调

  • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是:

  • 问题内容: 使用Passport.js是否可以为同一路由指定多个身份验证提供程序? 例如(在护照指南中),我可以在以下示例路线中使用本地策略以及Facebook和Twitter策略吗? 问题答案: Passport的中间件的构建方式使您可以在一个呼叫中使用多种策略。 但是,它是用OR顺序定义的。也就是说,只有在所有策略均未成功返回的情况下,它才会失败。 这是您将如何使用它: 换句话说,使用它的方法

  • 我想用两种不同的编码密码方法链接两个用户提供程序(FosUserBundle和一个自定义DB用户提供程序over-spreep) app/config/security.yml 我的问题:password的哈希值跟在fos_用户表中的$password.'{.$salt.'}'和自定义数据库用户提供程序中的$salt.$password后面 这个要点https://gist.github.com/