java - 如何使用自定义参数配置提供程序?

标签 java guice

我的类依赖于一些需要一些参数然后进行网络调用的服务,目前我正在传递这些参数,然后通过注入(inject)到我的类中的工厂创建这些服务。我需要将这些服务作为依赖项注入(inject),我知道我可以为它们创建提供程序,但在大多数示例中,我看到提供程序通常绑定(bind)到固定值,例如 serveraddres 等。我需要在运行时给出 then 值。

下面是我的示例代码:

public SomeClass {
   private final SomeFactory someFactory;

   @Inject
   SomeClass(SomeFactory factory) {
      someFactory = factory;
   }

   public Foo getFoo(String fooId) {
      FooService fooService = someFactory.getFooService(fooId);
      return fooService.getFoo();
   }

}

我需要做的是:

public SomeClass {
   private final FooService fooService;

   @Inject
   SomeClass(FooService fooService) {
      this.fooService = fooService;
   }

   public Foo getFoo(String fooId) {
      return fooService.getFoo();
   }

}

更新1

使用例更加清晰:

  @Provides
  @RequestScoped
  public SomeService provideSomeService(Dep1 dep1, String code) throws IOException {
    return new SomeService.Builder()
        .withApplicationName("Foo")
        .setCode(code)  
        .build();
  }

这里,code默认可以是null,需要时我可以在其中赋予一些值。

我可以在创建之前将参数传递给提供者吗?

最佳答案

如果您的值有绑定(bind)(这里,code 是一个没有绑定(bind)注释的字符串),那么您的更新 1 正是代码的样子。

在实践中,存在一些差异:

  • intString 值等常量通常使用绑定(bind)注释(@Named 或自定义注释)进行注释。
  • 如果您需要在 Guice 初始化后将值注入(inject)到对象图中,但对象图足够深,依赖注入(inject)仍然是一个好主意,您可以创建一个 child injector 。通过这种方式,您可以在一个操作或对象中访问 @Named("code") String,但不能在整个 Guice 应用程序中访问。
  • 如果您的 code 值足够动态,无法通过 Guice 作为自己的键提供,那么您必须使用某种工厂来传递它。对于基于构建器的对象,我想说您的 SomeFactory 实现是我针对您的情况提出的最佳实现。

如果您不需要使用构建器,并且可以让 Guice 根据您的字段或构造函数参数创建对象,您可以代码生成一个工厂。

  • Guice 可以通过 FactoryModuleBuilder 为您生成一个工厂,其功能称为 "assisted injection" .
  • Google 的其他工具 AutoFactory ,将代码生成一个可以在 Guice 和 Dagger 中工作的工厂实现。 (它捆绑为“Auto”,其中包括一个名为 AutoValue 的模型对象生成器,它还生成注释实现。)

我在my other SO answer here中放置了一个 child 注入(inject)器和辅助注入(inject)的小型演示。 .

关于java - 如何使用自定义参数配置提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003428/

相关文章:

java - 十六进制颜色到 HSV 转换 Java

java - 无法将测试配置注入(inject) Play! 2.6 Guice创建的应用程序

java - guice绑定(bind)到实例和asEagersingleton有什么区别

java - MyBatis - 在同一服务调用中连接到多个数据库

java - 什么是 Guice Mapbinder 的好用例?

java - 采访Q : Binary tree Inorder traversal

java - 无法在 Heroku (Java) 上加载 DLL

java - 如何发送创建 JSON 字符串并将其从服务器发送到 android?

java - 从证书 DN 中解析 CN

guice - 如何使用 guice-servlet 将过滤器映射到 servlet?