[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 メーリングリストの案内