【问题标题】:Create a Guava TypeToken in Spring xml config?在 Spring xml 配置中创建 Guava TypeToken?
【发布时间】:2013-03-21 22:07:56
【问题描述】:

我希望能够通过将 Guava TypeToken 对象指定为 Spring xml 配置中的 bean 来注入它们。有没有好的方法来做到这一点?有没有人写过任何 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>>() {};
  }
}

系统测试配置.xml:

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

有没有办法只用一个 xml 配置来做到这一点?

【问题讨论】:

  • 既然用的是Spring注解,为什么还要再用XML配置bean呢?
  • 使用 xml 配置而不是注解的原因有几个,但最主要的原因是将配置与实现分开。如果您有多个具有不同配置的相同实现的用户,这将特别有用。另一个原因是因为我的员工需要它,因为架构师之前的决定我不能立即改变。

标签: spring generics guava


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    回答我自己的问题: 可以使用静态构造函数 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) 构造函数与使用Google GuiceTypes 实用程序构造的ParameterizedType 一起使用的方法。 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>() {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      相关资源
      最近更新 更多