[Seasar-user:3431] Re: 自動バインディングについて

Ito Yoshiichi [E-MAIL ADDRESS DELETED]
2006年 3月 27日 (月) 19:40:21 JST


こんにちは。
伊藤と申します。

穐山さんの意図されている(と思われる)ことですが、
ライフサイクルが逆転する箇所はDIではなく ServiceLocator
を使えば良いのではないでしょうか?

↓こんな感じ。
public interface Foo {
    public void doSomething();
}

public interface Bar {
    public void doSomething();
}

public interface BarLocator {
    public Bar getBar();
}

public class FooImpl implements Foo {
    private BarLocator locator;
    public void setLocator(BarLocator locator) {
        this.locator = locator;
    }
    public void doSomething() {
        Bar bar = locator.getBar();
        System.out.println(this);
        System.out.println(bar);
        bar.doSomething();
    }
}

public class BarImpl implements Bar {
    public void doSomething() {
        System.out.println("doSomething!!");
    }
}

public class BarLocatorImpl implements BarLocator {
    private S2Container container;
    public void setContainer(S2Container container) {
        this.container = container;
    }
    public Bar getBar() {
        return (Bar)container.getComponent(Bar.class);
    }
}

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC
  "-//SEASAR//DTD S2Container//EN"
  "http://www.seasar.org/dtd/components.dtd">
<components>
  <component class="sandbox.FooImpl" instance="singleton"/>
  <component class="sandbox.BarImpl" instance="prototype"/>
  <component class="sandbox.BarLocatorImpl" instance="singleton"/>
</components>

ServiceLocator は S2Container そのものでもいいのですが、
そうすると、業務ロジックがS2に依存してしまうので、
別インタフェース/クラスを作っています。




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