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