Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringXML配置中创建GuavaTypeToken?_Spring_Generics_Guava - Fatal编程技术网

在SpringXML配置中创建GuavaTypeToken?

在SpringXML配置中创建GuavaTypeToken?,spring,generics,guava,Spring,Generics,Guava,我希望能够通过在SpringXML配置中将对象指定为bean来注入对象。有什么好办法吗?是否有人编写了任何cade/库来简化此过程 TypeToken似乎通过使用反射来内省其泛型类型来工作,因此使用匿名类来构造,如: new TypeToken<List<String>>() {} newtypetoken(){} Spring的xml配置语法似乎根本不接受泛型,可能是因为它是在运行时构建的,不“需要”它们(因为泛型是编译时检查,在运行时在技术上被删除) 因此,我知道

我希望能够通过在SpringXML配置中将对象指定为bean来注入对象。有什么好办法吗?是否有人编写了任何cade/库来简化此过程

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

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>() {}