プロパティの設定(Spring1.2RC2)
beanへ値を設定する要素propertyには,List,Set,Map,Propertiesなどを設定することができる.さらに要素property内で要素beanを配置し,そこで(入れ子の)beanの定義を定義を行うこともできる.こうした要素propertyのいろいろな設定を試してみた.
本頁のサンプルのbeans.xmlを以下に示す.
上のbeans.xmlでは,要素propertyによって,以下の種類の設定をbeanに行っている.
要素value,idrefはString,それら以外はそれぞれの型である.
- java.util.Propertiesの設定
- 要素valueによる設定
- 要素idrefによる設定
- 要素beanによる設定
- java.util.Listの設定
- java.util.Mapの設定
- java.util.Setの設定
サンプルの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を設定している.

