自動バインディング
自動バインディングを使うと、コンポーネントに紐付くオブジェクトを自動的にバインドしてくれるらしい。
で、コンポーネントの実装を以下のように修正。
[HogeImpl.java]
public class HogeImpl implements Hoge {private Foo foo = null;
private Bar bar = null;
public HogeImpl(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}public void showMessage() {
System.out.println(foo.getMessage());
System.out.println(bar.getMessage());
}}
さらに、紐付くインターフェース(とその実装)を追加。
[FooImpl.java]
public class FooImpl implements Foo {public String getMessage() {
return "Fooです。";
}}
[BarImpl.java]
public class BarImpl implements Bar {public String getMessage() {
return "Barです。";
}}
で、diconファイルを修正。
[Hello.dicon]
で、実行。
Fooです。
Barです。
おー、勝手にバインドされてる。
セッター・インジェクションでも大丈夫かなと思って、コンポーネントの実装を修正。
[HogeImpl.java]
public class HogeImpl implements Hoge {private Foo foo = null;
private Bar bar = null;
public void setFoo(Foo foo) {
this.foo = foo;
}public void setBar(Bar bar) {
this.bar = bar;
}
これでも、大丈夫だった。
Fooです。
Barです。
今度は、孫オブジェクトまで自動的にバインドされるか試してみる。
FooImpl、BarImplを修正。
[FooImpl.java]
public class FooImpl implements Foo {private Foo2 foo2 = null;
public FooImpl(Foo2 foo2) {
this.foo2 = foo2;
}public String getMessage() {
return foo2.getMessage();
}}
[BarImpl.java]
public class BarImpl implements Bar {private Bar2 bar2 = null;
public BarImpl(Bar2 bar2) {
this.bar2 = bar2;
}public String getMessage() {
return bar2.getMessage();
}}
Foo2、Bar2の実装を追加。
[FooImpl2.java]
public class FooImpl2 implements Foo2 {public String getMessage() {
return "Foo2です。";
}}
[BarImpl2.java]
public class BarImpl2 implements Bar2 {public String getMessage() {
return "Bar2です。";
}}
diconファイルも修正。
[BarImpl2.java]
で、実行。
孫まで、ちゃんとバインドされる。
Foo2です。
Bar2です。
あと、FooImplを次のように修正したら、当たり前だけど例外が発生。
[FooImpl.java]
public class FooImpl implements Foo {private Foo foo = null;
public FooImpl(Foo foo) {
this.foo = foo;
}
org.seasar.framework.container.CyclicReferenceRuntimeException: [ESSR0047]FooImplで循環参照が発生しました
at org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:43)
...