我希望能够通过在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配置?
答案 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实用程序构建的Types。 Guava 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>() {}