DIコンテナはメソッドの引数を指定するするためではなく、コンストラクタの引数を指定するために使うものという認識は正しいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
DI(Dependency Injection)は依存性を無くすためのものです。
依存性とはnewでありimportです。
ようは、そのクラスが削除されてしまうと、コンパイルが通らないという状況が依存です。
一般的にクラス間を疎結合にするにはインターフェースを使いますが、
インターフェースを使ったところで、
実装クラスをどこかでnewしなければいけない状況は変わりません。
newすらも自分でしたくないということで登場したのがDIです。
自分でnewしてしまうと、そのクラスではなく別のクラスを使いたくなった時に、
呼び出し元のクラスを書き換える必要があります。
書き換えてしまうとテストをする必要が出てきます。
あるクラスのインスタンスを作成し、そのインスタンスの各フィールドなどを設定して
使える状態にする。
これらをクラスを編集して行うのではなく、全て外部(設定ファイル)で行い、
任意のクラスにそのインスタンスを注入(Injection)する。
つまり、呼び出し元のクラスを全く編集することなく、処理をごっそり別物に変えることができる。
それがDIの真髄です。
呼び出し元のクラスを触っていないわけですから、
注入するクラスのユニットテストさえ終わっていれば、処理を変え放題ということになります。
コンストラクタやセッターというのは、注入手段でしかなく
それ自体はDIの本質ではありません。ケースバイケースってことです。
投稿2017/10/17 00:49
編集2017/10/18 03:15総合スコア4666
0
ビギナーの私の認識では、newしてくれたインスタンスを、作成したクラスのフィールド、コンストラクタに代入してくれる認識です。そして、そのインスタンスの生存期間をセッション単位なのか、リクエスト単位、代入される都度などにコントロールしてくれると認識してます。
例えば生存期間をセッションにすると、ログイン成功後のユーザーIDを画面を跨いで保持できるし、リクエストスコープにするとリクエストを受信した期間、DIコンテナに登録したビーン(インスタンス)は生存しており、それをクラスやメソッド間で引き回したい場合も、引数に渡さずとも、引き回したいクラスで@autowiredでインジェクションしたらクラス内のどこでも使用できます。
ただし、コレがベストな設計であるかはわかりませんが。
投稿2017/10/16 23:37
編集2017/10/16 23:57総合スコア12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。