我正在尝试从 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) X
或Provider<X>
自动为您服务,因此请随意绑定(bind)它,但是最方便。
关于dependency-injection - Google Guice - 如何将参数传递给第三方库工厂类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15517545/