2

Spring xml 構成で Bean として指定することにより、Guava TypeTokenオブジェクトを注入できるようにしたいと考えています。これを行う良い方法はありますか?これを簡単にするために誰かが cade/library を書きましたか?

TypeToken は、リフレクションを使用してジェネリック型をイントロスペクトすることで機能するようであり、次のような匿名クラスを使用して構築されます。

new TypeToken<List<String>>() {}

おそらく、Spring の xml 構成構文はジェネリックをまったく受け入れないようです (ジェネリックはコンパイル時のチェックであり、実行時に技術的に消去されるため)。

したがって、TypeToken Bean をインスタンス化する唯一の方法は、Java で行うことです

TokenConfig.java:

@Configuration
public class TokenConfig {
  @Bean
  public TypeToken<List<String>> listOfStringsToken() {
      return new TypeToken<List<String>>() {};
  }
}

システム テスト config.xml:

<beans>
  <context:annotation-config/>
  <bean class="com.acme.TokenConfig"/>
  <bean class="com.acme.Consumer">
    <property name="typeToken" ref="listOfStringsToken"/>
  </bean>
</beans>

xml構成だけでこれを行う方法はありますか?

4

2 に答える 2

0

おそらく、Spring FactoryBeans を使用できます: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.htmlでファクトリ メソッドを探します。

于 2013-05-27T20:13:30.830 に答える
0

私自身の質問に答えるには:静的コンストラクターTypeToken.of(Class)を使用して非ジェネリック TypeToken を作成することは可能ですが、これはより深いジェネリック型では機能しません。

Spring xml 構成は次のとおりです。

<bean class="com.google.common.reflect.TypeToken" factory-method="of">
  <constructor-arg type="java.lang.Class" value="java.lang.Integer" />
</bean>

これは次と同等です:

TypeToken.of(Integer.class)

new TypeToken<Integer>() {}

また、 Google GuiceTypesユーティリティを使用して構築されたParameterizedTypeでTypeToken.of(Type)コンストラクターを使用する方法も見つけました。Guava にもありますが、公開されていません。:'( これが TypeToken/TypeCapture を使用するのと同じくらい堅牢かどうかはわかりませんが、うまくいくようです。残念ながら、かなり醜くて長いです... (誰かがそれを単純化できるでしょうか?)

<bean class="com.google.common.reflect.TypeToken" factory-method="of">
  <constructor-arg index="0">
    <bean class="com.google.inject.util.Types" factory-method="newParameterizedType">
      <constructor-arg index="0">
        <value type="java.lang.Class">java.util.List</value>
      </constructor-arg>
      <constructor-arg index="1">
        <array><value type="java.lang.Class">java.lang.String</value></array>
      </constructor-arg>
    </bean>
  </constructor-arg>
</bean>

これは次と同等です:

new TypeToken<List<String>() {}
于 2013-06-07T21:51:04.890 に答える