[Seasar-user:718] instance="prototype"にはまった私

B interlink.or.jp jazzatny jazzatny
2004年 4月 30日 (金) 20:45:55 JST


佐藤と申します。seasar使いこなそうとがんばってます。

早速ですが、instance="prototype"とautoBindingとの
関係について質問です(少し長くなりますがよろしくお願い
します)。

seasar-2.0.6を使用しています。

1)下のソースのままでMaximClientを実行すると、
++ 私は
++ 勘違い
++ しています。
と出力されます。

2)次に、MaximDisplayの引数なしコンストラクタのコメント
をはずし実行すると、
java.lang.NullPointerException
    at test.seasar.MaximDisplay.setMaximStr
       (MaximDisplay.java:17)
とExceptionをはきます。これはmaxim.xmlに
autoBinding="constructor"もしくは"auto"を
設定しても同様です。

3)更に、maxim.xmlのコンポーネントname="display"に
<arg>maxim</arg>を設定し実行すると、
++ しています。
++ しています。
++ しています。
と出力されます。これもmaxim.xmlに
autoBinding="constructor"、"auto"を設定しても同様です。

マニュアルの自動バインディングの説明を読むと1、2、3
ともに1のケースのようにMaximコンポーネントを新規インス
タンスとして生成の上、MaximDisplayコンポーネントを生成
するように思えるのですが、
++ 私は
++ 勘違い
++ しています。
でしょうか。

長くなりましたが(下にも続きますが)よろしくお願いします。

以下、テスト用ソース
----------------------
public interface IMaxim{
      public void setMaximStr(String maxim);
      public String getMaximStr();
}
----------------------
public class Maxim implements IMaxim{
      private String maximStr_;
      public Maxim(){
          System.out.println("I'm Maxim-" +
                             this.toString() + ".");
      }
      public void setMaximStr(String str){
          maximStr_ = str;
      }
      public String getMaximStr(){
          return maximStr_;
      }
}
----------------------
public interface IMaximDisplay{
      public void setMaximStr(String str);
      public void display();
}
----------------------
public class MaximDisplay implements IMaximDisplay{
      private IMaxim maxim_;
//    public MaximDisplay(){
//    }
      public MaximDisplay(IMaxim maxim){
          System.out.println("maxim   >> " + maxim.toString());
          System.out.println("display >> " + this.toString());
          maxim_ = maxim;
      }
      public void setMaximStr(String str){
          maxim_.setMaximStr(str);
      }
      public void display(){
          System.out.println("++ " + maxim_.getMaximStr());
      }
}
----------------------
public class MaximClient{
   public static void main(String[] args){

          S2Container container =
             S2ContainerFactory.create("maxim.xml");

          container.init();

          MaximDisplay displayA =
             (MaximDisplay)container.getComponent(MaximDisplay.class);
          MaximDisplay displayB =
             (MaximDisplay)container.getComponent(MaximDisplay.class);
          MaximDisplay displayC =
             (MaximDisplay)container.getComponent(MaximDisplay.class);

          displayA.setMaximStr("私は");
          displayB.setMaximStr("勘違い");
          displayC.setMaximStr("しています。");

          displayA.display();
          displayB.display();
          displayC.display();

          container.destroy();
      }
}
----------------------
<!--maxim.xml-->
<components>
	<component name="maxim"
	    instance="prototype"
            class="Maxim">
	</component>
	<component name="display"
	    instance="prototype"
            class="MaximDisplay">
	</component>
</components>




Seasar-user メーリングリストの案内