Google Guice - 如何将参数传递给第三方库Factory类

时间:2013-03-20 07:20:04

标签: dependency-injection guice

我正在尝试从Spring迁移到Guice以进行依赖注入。以下是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之后,在我看来唯一的选择是为工厂建造工厂?这对我来说似乎很傻!

1 个答案:

答案 0 :(得分:2)

您可能需要为MyConnectionFactory创建一个Factory,但前提是您确实需要在运行时更改传递给MyConnectionFactory的参数。否则,你可以自己制作一个Provider - 毕竟这是一个工厂,我猜 - 或者是它的表妹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)绑定它。

但是,如果您在配置时知道所有构造函数参数,则可以在模块中同样创建@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会自动将XProvider<X>@Provides X的任意组合自动绑定到XProvider<X>的任何注入,因此请随意绑定它然而最方便。