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:永続化?