Spring Framework 始めました2
Beanに値を動的に設定するにはどうするんだろう?なんて漠然と考えていた訳ですが、普通にsetterメソッドを呼び出せばいいんですね。定義ファイル(beans.xml)に記述しなおしたりする必要があるのかと思っちゃいました。初期値が必要なもの意外は普通はnullを設定するものなのでしょうかね?
さて、このBeanですがBean要素には,singleton属性というものがあります。
singleton属性の値は(true/false)で、trueの場合BeanのインスタンスはBeanFactory内で共有され同一インスタンスが返却されます。falseの場合BeanFactoryから返されるインスタンスは常に新しいものとなるそうです。
早速検証してみます。
前回作ったbeans.xmlを以下のように修正します。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="m_message" class="sp.sample.data.Message" singleton="true"> <property name="text"><value>Good Morning !!</value></property> </bean> <bean name="e_message" class="sp.sample.data.Message" singleton="false"> <property name="text"><value>Good Evening !!</value></property> </bean> </beans>
次にメッセージ表示部分(Person.java)を以下のように変更。
package sp.sample.core; import java.util.ArrayList; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; import sp.sample.data.Message; public class Person { public static void main (String[] args) { try { XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); Message mMessage = (Message)factory.getBean("m_message"); Message eMessage = (Message)factory.getBean("e_message"); ArrayList<Message> messages = new ArrayList<Message>(); messages.add(mMessage); messages.add(eMessage); // メッセージの出力 showMessage(messages); // 再設定 mMessage.setText("Bad Morning !!"); eMessage.setText("Bad Evening !!"); // 再取得 mMessage = (Message)factory.getBean("m_message"); eMessage = (Message)factory.getBean("e_message"); messages.clear(); messages.add(mMessage); messages.add(eMessage); // メッセージの再出力 showMessage(messages); } catch (Exception e) { e.printStackTrace(); } } /** * メッセージを出力します。 * @param list メッセージのリスト */ private static void showMessage(ArrayList<Message> list) { for (Message m : list) { System.out.printf("message=%s\n", m.getText()); } } }
さあ、実行してみましょう。
message=Good Morning !! message=Good Evening !! message=Bad Morning !! message=Good Evening !!
singlton属性を設定したbean:m_messageの方はbeanが共有化*1されている為、変更が反映されている事がわかります。一方のbean:e_messageは常に新しいインスタンスが返却される為、変更よりも定義ファイルの値が有効になっています。
*1:永続化?