dependency-injection - Google Guice - 如何将参数传递给第三方库工厂类

标签 dependency-injection guice

我正在尝试从 Spring 迁移到 Guice 进行依赖注入(inject)。以下是 Spring xml 配置的示例片段:

<bean id="connectionFactory" class="org.somethirdparty.MyConnectionFactory">
  <property name="connectionUrl" value="${urls.connectionUrl}"/>
  <property name="ackMode" value="unordered"/>
  <property name="timeout" ref="timeoutBean"/>
</bean>

<bean id="timeoutBean" class="java.lang.Integer">
  <constructor-arg value="10000"/>
</bean>

我正在努力弄清楚如何使用 Google Guice 参数化 MyConnectionFactory。我无法注释“MyConnectionFactory”的构造函数或方法,因为这是第三方库提供的类。

阅读 Guice FAQ 后在我看来,唯一的选择就是为工厂 build 一个工厂?这对我来说似乎很愚蠢!

最佳答案

您可能需要为 MyConnectionFactory 创建一个工厂,但前提是您确实需要在运行时更改传递给 MyConnectionFactory 的参数。否则,你可以通过创建 Provider 来逃脱惩罚。 ——我猜,这毕竟是一家工厂——或者它更 slim 的表弟 the @Provides Method 。 (我猜测相关类采用非特定或原始参数,否则 toConstructor binding 是另一种可能性。)

工厂看起来像这样:

public class MyConnectionFactoryFactory {
  @Inject Provider<SomeDependency> someDependencyProvider;

  public MyConnectionFactory create(String url) {
    return new MyConnectionFactory(someDependencyProvider.get(), url, 10000);
  }
}

提供者看起来是一样的,只是它实现了 Provider<MyConnectionFactory>create相反,将是零参数 get() 。您可以通过bind(MyConnectionFactory.class).toProvider(MyConnectionFactoryProvider.class)绑定(bind)它.

但是,如果您在配置时知道所有构造函数参数,您同样可以创建 @Provides模块中的方法,如下所示:

public class MyModule extends AbstractModule {
  @Override public void configure() { /* your configuration here */ }

  /* FYI: a @Provides method by any other name would return as sweet */
  @Provides MyConnectionFactory getConnectionFactory(SomeDependency dependency) {
    return new MyConnectionFactory(dependency, url, 10000);
  }
}

...它将您的“包装代码”样板带到三个额外的非空白行。请记住,Guice 将自动绑定(bind) X 的任意组合, Provider<X> ,或@Provides X任何注入(inject) XProvider<X>自动为您服务,因此请随意绑定(bind)它,但是最方便。

关于dependency-injection - Google Guice - 如何将参数传递给第三方库工厂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15517545/

相关文章:

javascript - AngularJS:将服务注入(inject)指令?

dependency-injection - 使用 Ninject 2.0 避免 XNA 中的循环依赖

gwt - GIN @Inject on variable for Rpc Services

java - Dropwizard quartz 作业不适用于 Guicey

multithreading - 多线程中的 Guice 和 RequestScoped 行为

jpa - Google Guice 持久化 + Spring Data JPA

c# - 尝试激活时无法解析服务类型

javascript - 在 module.config 中使用 $filter 服务

c# - 让 Automapper 使用由带有 WebApi 的 Autofac 构建的服务

java - 使用 ActorSystem 和 Guice 时停止时出现异常