在Spring xml配置中创建一个Guava TypeToken?

时间:2013-03-21 22:07:56

标签: spring generics guava

我希望能够通过在Spring xml配置中将它们指定为bean来注入Guava TypeToken个对象。有没有办法做到这一点?有没有人写过任何cade /库来让这更容易?

TypeToken似乎通过使用反射来内省其泛型类型,因此使用匿名类构造,如:

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

Spring的xml配置语法似乎根本不接受泛型,大概是因为它是在运行时构建的并且“不需要”它们(因为泛型是编译时间检查并且在运行时被技术擦除)。

因此我知道实例化TypeToken bean的唯一方法就是in 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配置?

2 个答案:

答案 0 :(得分:0)

也许你可以使用spring FactoryBeans:在http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html

寻找工厂方法

答案 1 :(得分: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>() {}

我还找到了一种方法,可以使用TypeToken.of(Type)构造函数和使用ParameterizedType Google Guice实用程序构建的TypesGuava has one too,但它不公开。 :'( 我不确定它是否像使用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>() {}