1

我正在尝试从 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”的构造函数或方法,因为这是由第 3 方库提供的类。

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

4

1 回答 1

2

您可能需要为 MyConnectionFactory 创建一个工厂,但前提是您确实需要在运行时更改传递给 MyConnectionFactory 的参数。否则,你可以制作一个Provider——我猜这毕竟是一个工厂——或者它更苗条的表亲 @Provides 方法。(我猜有问题的类采用非特定或原始参数,否则 atoConstructor binding是另一种可能性。)

工厂看起来像这样:

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

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

Provider 看起来是一样的,除了它会实现Provider<MyConnectionFactory>create而是一个 zero-arg 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 会自动为您自动绑定 、 或 的任何组合,因此您X可以随意绑定它,但最方便。Provider<X>@Provides XXProvider<X>

于 2013-03-22T02:53:06.490 回答