1

依存性注入のためにSpringからGuiceに移行しようとしています。これは、Springxml構成のサンプルスニペットです。

<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>

MyConnectionFactoryをGoogleGuiceでパラメータ化する方法を見つけるのに苦労しています。'MyConnectionFactory'のコンストラクターまたはメソッドに注釈を付けることはできません。これは、サードパーティのライブラリによって提供されるクラスであるためです。

Guice FAQを読んだ後、私には唯一の選択肢はファクトリーのためのファクトリーを作ることだと思いますか?それは私にはばかげているようです!

4

1 に答える 1

2

MyConnectionFactoryのファクトリを作成する必要がある場合がありますが、実行時にMyConnectionFactoryに渡されるパラメータを実際に変更する必要がある場合に限ります。Providerそれ以外の場合は、 (結局のところファクトリーである)またはそのスリムないとこである@Providesメソッドを作成することで逃げることができます。(問題のクラスは、非特定または原始的な引数を取ると思います。そうでない場合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);
  }
}

...これにより、「ラッパーコード」ボイラープレートが空白以外の3行に追加されます。Guiceは、、、の任意の組み合わせ、または任意のインジェクションに自動的にバインドするか、自動的XProvider<X>バインド@Provides XするXのでProvider<X>、自由にバインドしてください。ただし、最も便利です。

于 2013-03-22T02:53:06.490 に答える