在SpringXML配置中创建GuavaTypeToken?
我希望能够通过在SpringXML配置中将对象指定为bean来注入对象。有什么好办法吗?是否有人编写了任何cade/库来简化此过程 TypeToken似乎通过使用反射来内省其泛型类型来工作,因此使用匿名类来构造,如:在SpringXML配置中创建GuavaTypeToken?,spring,generics,guava,Spring,Generics,Guava,我希望能够通过在SpringXML配置中将对象指定为bean来注入对象。有什么好办法吗?是否有人编写了任何cade/库来简化此过程 TypeToken似乎通过使用反射来内省其泛型类型来工作,因此使用匿名类来构造,如: new TypeToken<List<String>>() {} newtypetoken(){} Spring的xml配置语法似乎根本不接受泛型,可能是因为它是在运行时构建的,不“需要”它们(因为泛型是编译时检查,在运行时在技术上被删除) 因此,我知道
new TypeToken<List<String>>() {}
newtypetoken(){}
Spring的xml配置语法似乎根本不接受泛型,可能是因为它是在运行时构建的,不“需要”它们(因为泛型是编译时检查,在运行时在技术上被删除)
因此,我知道实例化TypeTokenbean的唯一方法是:
TokenConfig.java:
@Configuration
public class TokenConfig {
@Bean
public TypeToken<List<String>> listOfStringsToken() {
return new TypeToken<List<String>>() {};
}
}
@配置
公共类令牌配置{
@豆子
public TypeToken listOfStringsToken(){
返回新的TypeToken(){};
}
}
system-test-config.xml:
<beans>
<context:annotation-config/>
<bean class="com.acme.TokenConfig"/>
<bean class="com.acme.Consumer">
<property name="typeToken" ref="listOfStringsToken"/>
</bean>
</beans>
有没有一种方法可以通过一个xml配置来实现这一点?也许您可以使用spring FactoryBeans:在上查找工厂方法来回答我自己的问题: 可以使用静态构造函数创建非泛型TypeToken,但这不适用于更深层的泛型类型 以下是Spring xml配置:
<bean class="com.google.common.reflect.TypeToken" factory-method="of">
<constructor-arg type="java.lang.Class" value="java.lang.Integer" />
</bean>
及
newtypetoken(){}
我还找到了一种方法,可以将构造函数与constructed using的实用程序一起使用,但这不是公开的。:'(
我不确定这是否和使用TypeToken/TypeCapture一样健壮,但它似乎可以工作。不幸的是,它非常丑陋而且很长…(也许有人可以简化它?)
java.util.List
java.lang.String
这相当于:
TypeToken.of(Integer.class)
new TypeToken<List<String>() {}
new typetoken既然您使用的是Spring注释,为什么要再次在XML中配置bean?使用XML配置而不是注释有几个原因,但主要原因是要将配置与实现分开。如果同一实现中有多个用户使用不同的配置,这一点尤其有用另一个原因是因为我的雇主需要它,因为建筑师以前的决定我不能马上改变。
<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>() {}