[Seasar-user:1633] DIコンテナのインスタンス管理(instance属性のouterについて)
豊島 正規
masaki-toyoshima
2005年 3月 16日 (水) 16:32:54 JST
はじめまして。豊島と申します。
最近触り始めたばかりで、ホームページを見ながら色々触っている段階なのです
が、タイトルに書いたように「instance属性のouter」についてちょっと分から
ない事がありましたのでめーるしました。
外部でインスタンス化されたコンポーネントを
injectDependency(Object outerComponent, String componentName)
というメソッドを利用して、S2が管理しているコンポーネントと関連付けたいの
ですが、以下のようなExceptionが発生してしまいます。
java.lang.UnsupportedOperationException: deploy
ソースコードを少し読んだのですが、AbstractComponentDeployerを継承してい
るComponentDeployerのうち、OuterComponentDeployerだけdeployメソッドが呼
ばれるとExceptionが発生するようになっているのですが、これはまだ未実装と
いうことなのでしょうか。
それとも私の利用方法が間違っているのでしょうか。
申し訳ありませんが、お分かりの方がいらっしゃいましたら教えていただけない
でしょうか。
以下、今回作成した単純なプログラムです。
■diconファイル
<components>
<component name="hello" class="tech.di.HelloImpl" instance="prototype">
<property name="hoge">hoge</property>
</component>
<component name="hoge" class="tech.di.Hoge" instance="outer" />
</components>
■IHello.java
public interface IHello {
void showMessage();
}
■HelloImpl.java
public class HelloImpl implements IHello {
private Hoge hoge;
public void showMessage() {
hoge.print();
}
public void setHoge(Hoge hoge) {
this.hoge = hoge;
}
}
■Hoge.java
public class Hoge {
private String message;
public Hoge(String message) {
this.message = message;
}
public void print() {
System.out.println(message);
}
}
■main
public class DISample {
public static final String PATH = "tech/di/sample.dicon";
public static void main(String[] args) {
Hoge hoge = new Hoge("こんにちは Seasar");
S2Container container = S2ContainerFactory.create(PATH);
container.injectDependency(hoge, "hoge");
IHello helloObject = (IHello)container.getComponent(IHello.class);
helloObject.showMessage();
}
}
■実行結果
java.lang.UnsupportedOperationException: deploy
at org.seasar.framework.container.deployer.OuterComponentDeployer.deploy(OuterComponentDeployer.java:23)
at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:75)
at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:83)
at org.seasar.framework.container.ognl.S2ContainerPropertyAccessor.getProperty(S2ContainerPropertyAccessor.java:21)
at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1616)
at ognl.ASTProperty.getValueBody(ASTProperty.java:96)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
at ognl.SimpleNode.getValue(SimpleNode.java:213)
at ognl.Ognl.getValue(Ognl.java:333)
at ognl.Ognl.getValue(Ognl.java:413)
at ognl.Ognl.getValue(Ognl.java:395)
at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:21)
at org.seasar.framework.container.impl.ArgDefImpl.getValue(ArgDefImpl.java:35)
at org.seasar.framework.container.assembler.AbstractPropertyAssembler.getValue(AbstractPropertyAssembler.java:23)
at org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:38)
at org.seasar.framework.container.deployer.PrototypeComponentDeployer.deploy(PrototypeComponentDeployer.java:23)
at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:75)
at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:83)
at tech.di.DISample.main(DISample.java:23)
Seasar-user メーリングリストの案内