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