33

ここで合理的な答えが見つからなかったので、重複していないことを願っています。では、単純なものよりもセッターまたはコンストラクターの注入を優先する必要があるのはなぜですか

@Inject
MyBean bean;

クラスの初期化中に注入された Bean で何かをする必要がある場合は、コンストラクター注入を使用します。

public void MyBean(@Inject OtherBean bean) {
    doSomeInit(bean);
    //I don't need to use @PostConstruct now
}

でもそれでもほぼ同じ like@PostConstructメソッドだし、setter インジェクションもまったく受けていないのは、Spring や他の DI フレームワークの後の遺物ではないでしょうか。

4

3 に答える 3

3

CDIを使用する場合、コンストラクターまたはセッターの注入を使用する理由はまったくありません。質問で述べたように、@PostConstructそうでなければコンストラクターで行われるメソッドを追加します。

単体テストでフィールドを挿入するにはリフレクションを使用する必要があると言う人もいるかもしれませんが、そうではありません。モック ライブラリやその他のテスト ツールがそれを行います。

最後に、コンストラクター注入により、フィールドを にすることができますが、これは、注釈付きフィールド ( にすることはできません)finalの実際の欠点ではありません。アノテーションが存在し、フィールドを明示的に設定するコードが存在しないことと組み合わせることで、コンテナー (またはテスト ツール) によってのみ設定されることが明確になります。実際には、注入されたフィールドを再割り当てする人はいません。@Injectfinal

コンストラクターとセッターの注入は、開発者が通常手動でインスタンス化してテスト対象のオブジェクトに依存関係を注入する必要があった過去には意味がありました。今日、テクノロジーは進化しており、フィールド注入ははるかに優れたオプションです。

于 2015-02-24T21:01:25.070 に答える