簡単に書くと
ドコの
xxxDao dao; /* 実は普通のクラスではなくinterfaceクラス */
なソースに
dao.selectXXXX(dto);
すれば、
簡単にNullPointerExceptionが起きて使えないが、
どこかでコッソり
dao = new xxxDaoBean();
してしまえば使える様になるたったそれだけのこと。
@EJB ejb.jarのどこかのクラスのstatic Mainメソッド
とか
@Resource ibatis.jarのどこかのクラスのstatic Mainメソッド
とか
アノテーションを書いておけば、誰かがやってくれる。
ハズ。
え?勝手にどうやって動くのか?
class xxxx{
static {
/* スタティックの無名領域で初期化を無意識に恣意的に実行 */
initialize();
}
void static initialize () {
/* 沢山の初期化処理 */
}
}
で、いいじゃないですかね?
簡単でしょ?
※同じことはC++でも出来ます。
実は、環境に応じて、
dao = new batchDaoBean();
とか
dao = new onlineDaoBean();
とか
dao = new androidDaoBean();
とか
dao = new iosDaoBean();
とかに差し替えが効くところが良いのだが、
実際にはそんな使い方をすることは・・・
アリエナイ話。(爆
実にJavaは、何かのjarのMainが勝手に初期化するので、どんな動きになるか、判ったものではない。
当然のことだが、安易なインジェクションはソースレベルデバッグを困難にさせる。
strutsもそうだが、ソースが無いclassを跨いでワークフレームを作ることが多いからだ。
競合が起きて当たり前だし、上記の初期化処理に膨大な時間がかかるのも当然の話。
で、なんでそんなものを使うのか?
一つにはモジュールの差し替えがしやすい点があるものの。
そんなものはワークフレーム側の話で、それにぶら下がるクラスは普通に作ればいいはず。
でも、過去のインジェクションのデザインは、その上下関係が間違っていて、ワークフレームに作り込む方が
自動的にインタフェースじの変数にオブジェクトがインジェクションされることを前提にしている。
これは、ワークフレーム側がインジェクションの仕組みをカスタマイズする手法を勘違いして作ってしまったためだろう。
というかサンプルでサクっと作ったら、出回ってしまったと考えた方がいいだろう。
だって
/* フレームワークのソース */
for(Class class : all_class_list ) {
if( class.isClass() ) {
for(Method method : class.getMethodList() ) {
if( method.class.isInterface ) {
if(method.value == null) {
Object object = classMap(method.getClassName());
if( object != null ) {
method.value = object.getInstance();
}
}
}
}
}
}
な感じでnullにオブジェクトを挟んでくれたら楽そうに思える。
でも、その実態は・・・
interface xxx = new XxxBean();
XXX.method()
を
@xxxInjection
interface xxx;
XXX.method();
と書いて、全ソースのインジェクションを巡回する長~い初期化に時間を費やすことになり、
デバッグも面倒なので、
何も得るものはない。
ま、失敗なのだが、駄作であれ、悪貨であれ、出回ってしまったものが勝ちな世の中。
強いて云えば、
自分で作るつもりが無い部分をinterfaceとしてコードし、
その実装を外注に出せばいいだけだが
interfaceをclassに書き換えらる。(自分のコードを書き換えられるのが嫌)なら、
先のEJB手法が必要だ。
もっとも、
java -jar 自分のソース.jar -jar interface.jar
を
java -jar 自分のソース.jar -jar interfaceの処理を実装したクラス.jar
で実行すれば済む話でしかないのがEJBだ。
もちろん、自分のソース.jar にinterfaceの処理を実装したクラス.jarを使ってコンパイルしておかないとうまく動かない気がする。
ので、やっぱりEJBがいい。と思ってしまうのだろう。
だが、そんなEJBの動作テストはどうやるのか?
実装.jarができるまで放置しておくのか?
その辺の考慮がごっそりと抜け落ちているのが
やはりJavaerの幼さなのだろう。
でも、世の中どんどん変なものが残っていくのも仕方がないことだよね。(大笑