コンストラクタインジェクション
DIコンテナのインジェクション方法はこれ一択。DIコンテナ抜きにしても、コンストラクタインジェクションならバニラDIにも対応可能。また、Spring のサンプルコード等でよく見かける @Autowired によるフィールドインジェクションは、以下の引用にもある通り避けるべき。
これらのインジェクション方式の中で私はコンストラクタインジェクションをオススメします。
理由は簡単で、前半に述べた通りコンストラクタを通じてインジェクションすることはJavaのクラス設計としてごく普通の方式だからです。
フィールドインジェクションやメソッドインジェクションではインスタンスを生成してから依存コンポーネントを渡して完成させるので順番が逆です。
また、コンストラクタインジェクションであれば受け取った依存コンポーネントをfinalなフィールドへセットすることが出来ます。 つまり、クラスをイミュータブルにしやすくなります。
そして、これは完全に主観になるのですが、1つのコンポーネントに対する依存コンポーネントの増えすぎを防止しやすいと考えています。 フィールドやセッターメソッドが増加するよりも、1つのコンストラクタが持つ引数が増加する方が違和感に気付きやすいと感じています。
ちなみに自分はここ2~3年 Lombok を使わないようにしており、なぜかと言えば @AllArgsConstructor や @RequiredArgsConstructor みたいな便利アノテーションを注釈すると、ついつい依存コンポーネントが増えがちになってしまうのがその理由の1つ。
あわせて読みたい