そもそもDIってナニよ?

「DIコンテナってナニ?」
朝イチにこの質問で吹っ飛んでしまった。
なんだろう???
わからないことは調べよう。まず「DIコンテナ」という言葉を分解することろから始めよう。
Dependency Injection Container(依存性の注入コンテナ)

  • 依存性(Dependency)
    • ←オブジェクト間の依存性(newしなくてもコンテナにくれと言うだけ)
  • 注入(Injection)
    • ←外部(プログラムの外)から設定する(ハードコーディングしない)
  • コンテナ(Container)
    • ←いろんなモノがのっかってる入れ物

つまりコンテナ様にお願いすると必要な値まで入っているオブジェクトのインスタンスをくれる仕組みである。

んで、値の入れ方(インジェクションの方法)は3種類ある。

  • コンストラクタインジェクション
    • オブジェクトのコンストラクタで値をつめる
  • セッターインジェクション
    • setterを使って値をつめる
  • メソッドインジェクション
    • 初期化メソッドを利用して値をつめる

生成するインスタンスの管理方法はinstance属性の設定で決まる。

  • singletonなら常に同じインスタンスをくれる
  • prototypeなら呼び出すたびに新しいインスタンスをくれる
  • requestならリクエストに対し1つ
  • sessionならセッションに対し1つ
  • outerは値を入れることしかしないので自分でインスタンスを作ってコンテナに登録する必要がある

つまりオブジェクトの生成タイミングはinstanceの設定による、デフォルトはsingletonなので
コンテナを生成して初期化した時にオブジェクトが生成される。

こんなところでしょうか。

補足:
Seasarだとコンポーネント間の依存関係をインターフェースのみで記述することができる。
(Springでは実装されたクラスが必要、らしい・・・)
これを実現するために自動バインディングという機能がある。
作ろうとしたものの指定がインターフェースだった場合、
インプリメントした実装クラスをコンテナが勝手に組み立てた上で、
インジェクションを行なったオブジェクトのインスタンスをくれるという便利な代物である。
だから、diconファイルに名前の指定がなくても勝手に探してインスタンス化して渡してくれるのだ。
S2Dao内で使用しているDaoMetaDataFactoryインターフェースのorg.seasar.dao.impl.DaoMetaDataFactoryImplが自動でインジェクションされるのは自動バインディングの賜物なのだ。