コンポーネントのライフサイクル
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に依存してしまうので、別インタフェース/クラスを作っています。