我正在尝试从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之后,在我看来唯一的选择是为工厂建造工厂?这对我来说似乎很傻!
答案 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会自动将X
,Provider<X>
或@Provides X
的任意组合自动绑定到X
或Provider<X>
的任何注入,因此请随意绑定它然而最方便。