コンポーネントのライフサイクル

id:aufheben:20060310 について、MLに投稿したけれどこちらにも書いておく。

コンポーネントのライフサイクルが逆転する箇所は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">

  
  
  

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