きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

寝ぼけてたんだろうか、気が付いたらまたコンテナ作ってたorz

どういうこった。思い出してみよう。


家のパソコンで作ろうとしてたんだっけかな。
そしたら家のパソコンがプツゥって電源落ちて、
そこからスイッチオォ〜〜〜ン。
LANケーブルを会社のシンクライアントに指して、
会社に置いてあるPCを1つ踏み台にして、
会社に置いてある自分PCに繋いで作ってた。


んーと、2時間くらいかな?
アノテーションが3クラス。
普通のクラスが2クラス。
利用サンプルが5クラス。(Configuration2,Car1,Human1,Main1)
簡単なコンテナはたったこんだけで作れる。
前にも同じようなのを作ったんだけど、
今回多少を改良を加えてみた。


SpringのJavaConfigをベースにしとります。
だからこんな書き方。
@Bean
public Human human(){
Human human = new Human();
human.setName("kidotaka");
human.setAge(30);
return human;
}
少し書き方を変えてみよう。
@Bean
public Human human(){
Human human = new Human();
human.setName(name());
human.setAge(age());
return human;
}
@Bean
public String name(){
return "kidotaka";
}
@Bean
public Integer age(){
return Integer.valueOf(30);
}


コンテナの設定に、コンテナを渡せるように改良してみる。
ApplicationContextAwareな感じだよ。
今までXMLだったところにAwareっぽいのを持ち込み、
ref属性のサポートを目指してる。parent属性は断念。
ParameterTypeを見て、勝手にinvoke。
@Bean
public Human human(JavaConfiguration dicon){
Human human = new Human();
human.setName(dicon.getBean("name",String.class));
human.setAge(dicon.getBean("age",Integer.class));
return human;
}
@Bean
public String name(){
return "kidotaka";
}
@Bean
public Integer age(){
return Integer.valueOf(30);
}


例が悪いんだけど、違いを感じ取れますかね?
シングルトンとしてコンテナ管理が出来てるかどうかって点が違う。
親コンテナで管理されてるBeanを使ったインジェクションが出来る点も違う。
コンストラクターインジェクションは相変わらず限定的だが、
セッターインジェクションの幅は広がった。


シングルトンの話は、こんな風に回避出来ることもある。
private static final NAME = "kidotaka";
private static final AGE = Integer.valueOf(30);
@Bean
public Human human(){
Human human = new Human();
human.setName(name());
human.setAge(age());
return human;
}
@Bean
public String name(){
return NAME;
}
@Bean
public Integer age(){
return AGE;
}
ただし、こんな風にstatic finalに逃がせない場合は苦しい。
どんな奴が苦しいかと言うと、humanをインジェクションしたい場合だ。
@Bean(scope="prototype")
public Car car(){
Car car = new Car();
car.setDriver(human());
}
private static final NAME = "kidotaka";
private static final AGE = Integer.valueOf(30);
@Bean
public Human human(){
Human human = new Human();
human.setName(name());
human.setAge(age());
return human;
}
@Bean
public String name(){
return NAME;
}
@Bean
public Integer age(){
return AGE;
}
こんなプロトタイプなCarがあったとしたら、
humanのインスタンスはシングルトンじゃなくなる。


さて、じゃあ、Humanの作りを変えたらstatic finalに出来るよ。
とりあえずコンストラクターを変えてみよう。
別に流れるインターフェースでもいい。
@Bean(scope="prototype")
public Car car(){
Car car = new Car();
car.setDriver(human());
}
private static final NAME = "kidotaka";
private static final AGE = Integer.valueOf(30);
private static final HUMAN = new Human(NAME,AGE);
@Bean
public Human human(){
return HUMAN;
}
@Bean
public String name(){
return NAME;
}
@Bean
public Integer age(){
return AGE;
}
ここまで来ると、誰がシングルトンを管理してんのか解らない。
そもそもインジェクションのために、
Humanの作りを変えてる時点でしょぼーんな感じだ。
だからコンテナを渡すことにした。


まあ、いいや。
もうちょい進んでAOPの実装を目指したいんだよなー。