ファイヤープロジェクト
プロパティの設定(Spring1.2RC2)
2005-05-14T15:45+09:00   matsu
beanへ値を設定する要素propertyには,List,Set,Map,Propertiesなどを設定することができる.さらに要素property内で要素beanを配置し,そこで(入れ子の)beanの定義を定義を行うこともできる.こうした要素propertyのいろいろな設定を試してみた.
本頁のサンプルのbeans.xmlを以下に示す.
上のbeans.xmlでは,要素propertyによって,以下の種類の設定をbeanに行っている.
  • java.util.Propertiesの設定
  • 要素valueによる設定
  • 要素idrefによる設定
  • 要素beanによる設定
  • java.util.Listの設定
  • java.util.Mapの設定
  • java.util.Setの設定
これらの設定が施されるbeanであるTopBeanType1のインタフェースTopBeanを以下に示す.
要素value,idrefはString,それら以外はそれぞれの型である.
サンプルのbeans.xmlでは,以下の部分が該当する.
<property name="messageProperty">
  <props>
    <prop key="message1">This is message1.</prop>
    <prop key="message2">This is message2.</prop>
  </props>
</property>
要素propertyの子要素として要素propsを記述する. この要素propsがjava.util.Propertiesを意味する. したがって,TopBeanの該当メンバであるmessagePropertyのsetter,getterは以下のようになっている.
public void setMessageProperty(Properties param);
public Properties getMessageProperty();
java.util.Propertiesへのプロパティー設定には,要素propsの子要素propを使用する. 要素propsは0個以上の子要素propを持つ. 要素propの必須属性keyにキー,内容に値を記述する.
サンプルのbeans.xmlでは,以下の部分が該当する.
<property name="beanProperty1">
  <value>innerBeanType1</value>
</property>
<property name="beanProperty2">
  <idref bean="innerBeanType2"/>
</property>
これらの該当メンバであるbeanProperty1,beanProperty2のsetter,getterは以下である.
public void setBeanProperty1(String param);
public String getBeanProperty1();
public void setBeanProperty2(String param);
public String getBeanProperty2();
要素value,要素idrefどちらによる設定もString型で扱っている. 両者の違いは,前者は単なる文字列値であるのに対し,後者は要素beanの属性idで設定した値でなければならない点である. また,要素idrefによる設定値の指定は属性beanによる方法と属性localによる方法がある. どちらも同一コンテキスト内に指定した値と同じid値を持つbeanが無ければならない. 前者はfactory実装によってチェックされる. ただし,バージョン1.2RC2で試してみたところ,Springは特にチェックをしてくれていないようだった. 後者はXML文書の妥当性チェック時にチェックされる(※).
※ 属性beanはCDATA,属性localはIDREFである.
<!ATTLIST idref bean CDATA #IMPLIED>
<!ATTLIST idref local IDREF #IMPLIED>
前頁まではルート要素beansの直接の子要素としての要素beanを使用してbeanを定義し,要素refを使用してpropertyに設定していた. 今回のサンプルでは,要素propertyの直接の子要素としての要素beanでbeanを定義し,同時にpropertyの設定とする.
<property name="beanProperty3">
  <bean id="innerBeanType3"
      class="org.fireproject.springsample.InnerBeanType1">
    <property name="innerValue"><value>30</value></property>
  </bean>
</property>
要素beanの属性や内容については,いままでと違う場所(要素propertyの下)で設定していること以外は今までと同じである. 上記の該当メンバbeanProperty3の型はInnerBeanなので,setterやgetterもInnerBeanを扱う.
public void setBeanProperty3(InnerBean param);
public InnerBean getBeanProperty3();
要素beanは他にも以下の要素内で記述することができる.
  • list
  • set
  • entry
  • key
詳細は次節以降に記述する.
サンプルのbeans.xmlでは,以下の部分が該当する.
<property name="codeList">
  <list>
    <value>AAA</value>
    <value>BBB</value>
    <value>CCC</value>
    <ref bean="innerBeanType1"/>
    <bean id="innerBeanType4"
           class="org.fireproject.springsample.InnerBeanType1">
      <property name="innerValue"><value>40</value></property>
    </bean>
  </list>
</property>
要素propertyの子要素として要素listを記述する. これがbean上にてjava.util.List型のメンバcodeListとなる. したがってメンバcodeListのsetter,getterは以下となっている.
public void setCodeList(List param);
public List getCodeList();
リストの各要素は子要素としてbean,ref,idref,value,null,list,set,map,propsを記述することで設定可能である. 以下DTDの該当部分.
<!ELEMENT list (
        (bean | ref | idref | value | null | list | set | map | props)*
)>
サンプルでは,要素valueを使用してString型値の設定,要素refを使用して他で定義したbeanの設定,要素beanを使用してbeanを定義しつつ設定を行っている.
サンプルのbeans.xmlでは,以下の部分が該当する.
<property name="mixMap">
  <map>
    <entry key="hoge">
      <value>This is hoge</value>
    </entry>
    <entry key="fuga">
      <value>This is fuga</value>
    </entry>
    <entry key="type1">
      <ref bean="innerBeanType1"/>
    </entry>
    <entry key="type2">
      <ref bean="innerBeanType2"/>
    </entry>
    <entry key="innerBean">
      <bean id="innerBeanType5"
             class="org.fireproject.springsample.InnerBeanType1">
        <property name="innerValue"><value>50</value></property>
      </bean>
    </entry>
    <entry>
      <key>
         <bean id="innerBeanType6"
               class="org.fireproject.springsample.InnerBeanType1">
           <property name="innerValue"><value>60</value></property>
         </bean>
      </key>
      <value>Value of innerBeanType6</value>
    </entry>
  </map>
</property>
要素propertyの子要素として要素mapを記述する. これがbean上にてjava.util.Map型のメンバmixMapとなる. したがってメンバmixMapのsetter,getterは以下となっている.
public void setMixMap(Map param);
public Map getMixMap();
マップの各要素は子要素entryによって設定する. 要素entryは属性keyか,子要素keyによってキーを設定し,子要素に値を設定する. 以下はキーを要素entryの属性keyでhogeと設定し,値を要子要素valueにてThis is hogeと設定している.
    <entry key="hoge">
      <value>This is hoge</value>
    </entry>
そして以下はキーを要素entryの子要素keyでキーをbeanに設定し(この要素beanは同時にそのbeanの定義もしている),値を(要素entryの)子要素valueでValue of innerBeanType6と設定している.
    <entry>
      <key>
         <bean id="innerBeanType6"
               class="org.fireproject.springsample.InnerBeanType1">
           <property name="innerValue"><value>60</value></property>
         </bean>
      </key>
      <value>Value of innerBeanType6</value>
   </entry>
要素entryの子要素はキーを子要素keyで設定する場合は,まず要素keyを記述し,それから該当Map要素の値として要素bean,ref,idref,value,null,list,set,map,propsのいずれかを記述する. 以下DTDの該当部分.
<!ELEMENT entry (
  key?,
        (bean | ref | idref | value | null | list | set | map | props)?
)>
要素entryの子要素keyもその値としてbean,ref,idref,value,null,list,set,map,propsのいずれかを記述する. 以下DTDの該当部分.
<!ELEMENT key (
        (bean | ref | idref | value | null | list | set | map | props)
)>
サンプルのbeans.xmlでは,以下の部分が該当する.
<property name="mixSet">
  <set>
    <ref bean="innerBeanType2"/>
    <value>hoge</value>
    <value>fuga</value>
    <bean id="innerBeanType7"
           class="org.fireproject.springsample.InnerBeanType1">
       <property name="innerValue"><value>70</value></property>
    </bean>
  </set>
</property>
要素propertyの子要素として要素setを記述する. これがbean上にてjava.util.Set型のメンバmixSetとなる. したがってメンバmixSetのsetter,getterは以下となっている.
public void setMixSet(Set param);
public Set getMixSet();
Setの要素は要素bean,ref,idref,value,null,list,set,map,propsの記述によって設定できる. 以下DTDの該当部分.
<!ELEMENT set (
        (bean | ref | idref | value | null | list | set | map | props)*
)>
サンプルでは,要素refによって他で定義されたbeanを,要素valueによって文字列を,要素beanによってbeanを定義すると同時にそのbeanを設定している.
matsu(C)
Since 2002
Mail to matsu