2009-04-28 19 views
31

でクラスを使用してのSpring Beanの定義しますFooの配列は、Tが何になるかを知っていると仮定しています(私の例では、Tは値が1と2の列挙型です)。は、一般的なパラメータ

<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 

編集:リストタグを忘れた瞬間に

は、このようなものを持つことはタイプTが何であるか春を伝えるには十分ではありません。

答えて

30

Springにはそのような場合の一般的なサポートはありませんが、コンパイラはこの場合にクラスキャストを作成するだけです。したがって、適切なソリューションは次のとおりです。

<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list value-type="example.MyEnumType"> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 
1
<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 

また、custom editorを定義することもできます。

+4

2人は出身ですか? – digiarnie

11

実際の例を考えてみましょう。

<bean id="simpleInt" 
     class="org.nipr.gateway.service.transaction_assistant.GenericSimple"> 
    <constructor-arg> 
     <!-- this can be any full path to a class --> 
     <value>java.lang.Integer</value> 
    </constructor-arg> 
</bean> 

<bean id="simpleString" 
     class="org.nipr.gateway.service.transaction_assistant.GenericSimple"> 
    <constructor-arg> 
     <value>java.lang.String</value> 
    </constructor-arg> 
</bean> 

単純なジェネリッククラス:

public class GenericSimple<T> { 
    private Class<T> type; 
    public GenericSimple(Class<T> type) { 
     this.type = type; 
    } 
    public T get(T t) { 
     return t; 
    } 
} 

と(工場を使用して)最後に、試験方法:どのように春が知っているん列挙ONE

public void testGeneric(){ 
    Factory factory = new Factory(new String[]{"config/beanForGenericTest.xml"}); 

    GenericSimple<Integer> simpleInt 
     = (GenericSimple<Integer>)factory.getClass("simpleInt"); 
    System.out.println(simpleInt.get(Integer.valueOf(100))); 
    Assert.assertTrue(simpleInt.get(Integer.valueOf(100)).equals(100)); 

    GenericSimple<String> simpleString = 
     (GenericSimple<String>)factory.getClass("simpleString"); 
    System.out.println(simpleString.get(new String("Rockets go fast."))); 
    Assert.assertTrue(simpleString.get("Rockets go fast.") 
     .equals("Rockets go fast.")); 
} 
関連する問題