Spring Bootで1年以上開発してきましたが、Autowiredコンストラクターを使用する利点をまだ理解していないため、誰かができるかどうか疑問に思いました。これとベストプラクティスと見なされるものを説明してください。
次のようにBeanを持っているとしましょう
@Component public class MyBean { void doSomeStuff() { } }
そして私はそのBeanに依存関係があるサービス
@Service public class MyServiceImpl implements MyService { private MyBean myBean; }
私にとって、このクラスに依存性を注入する最も簡単な方法は、変数に@Autowiredアノテーションを付けることです。
@Service public class MyServiceImpl implements MyService { @Autowired private MyBean myBean; }
しかし、このアプローチのようなものを好むオンラインの他の場所(および私のチームの他の開発者)があります:
@Service public class MyServiceImpl implements MyService { private MyBean myBean; @Autowired public MyServiceImpl(MyBean myBean) { this.myBean = myBean; } }
私にとって、そのようなコンストラクターを使用することは、単に冗長なコードです。 Beanの自動配線は、ボイラープレートコードのように見えるものよりもはるかに単純で簡単です。
コメント
回答
プライベート変数をパブリックにする代わりにパブリックゲッターとセッターを使用するのと同じ理由で、実際のコンストラクター。
実際の例:携帯電話は、安全で情報に敏感な物理的な場所では許可されていません。その安全な場所との通信は、監視も制御もされていない不正な通信チャネルによって密かに行われるのではなく、安全に確立され、制御され、暗号化された通信プロトコルを介して行われる必要があります。
コンサートでは、人々に次のことを許可しません。すでにスタジアムにいる誰かにフェンスを越えて物を投げます。出入りするものはすべてゲートを通過する必要があります。
コード例にこれだけの場合は、不必要に冗長な定型文のように見えます。ただし、コンストラクターでは、設定以外のことを行うことがよくあります。検証などのプライベート変数。多くのプログラミング言語では、事後にこれを行う方法を変更することは、バイナリ破壊の変更です。したがって、コンストラクターを事前に提供することは賢明なステップです。
最後に、クラスは依存性注入とは独立して機能できる必要があります。プライベートメンバーに注釈を付けたが、コンストラクターを含めなかった場合、「そのクラスは基本的にDIコンテナに緊密にバインドされており、クラスはそれなしでは機能しません。
コメント
- "コンサートでは、'人がフェンスを越えて' sはすでにstadiuにありますm。出入りするものはすべてゲートを通過する必要があります。"しかし、コンストラクターを使用すると自動配線がより安全になる方法がわかりません'コンストラクターの要件(検証など)がない場合、コンストラクターを使用することは有益ですか?
- バイナリ互換性を損なうことなく、後で検証を追加することができます。
- また、 、プライベートメンバーは実際にはプライベートのままである必要があることに注意してください。その'はプライベートメンバーを持つことの要点です。
- 要点は、@ Autowireと互換性のある設計のグッドプラクティスを可能にすることです。コンストラクターを持つことは、OOPで最も自然なことです。それどころか、(あなたが単純明快と呼ぶもの)はちょっと怖いです。コンストラクターを削除しても実際のメリットはありません。'シンプルさはまったくありません。コンストラクターは、OOPで最も単純なメソッドの1つです。それ自体、通常、SpringIoCの魔法を実装する価値のある複雑さはほとんどありません
- 'の価値については、Javaは とにかく非常に冗長な言語。 'その冗長性の一部を飼いならすために探している場合、コンストラクターを排除しても、へこみはあまりありません。
To me, using a constructor like that is simply redundant code. Autowiring the bean is much simpler and straightforward than what appears to me to be boilerplate code.
そして、プライベートでセッターのないインスタンス変数にBeanを注入する魔法について心配していませんか?これがあなた、あなたの同僚に生み出している莫大な技術的負債について心配していませんか?設計のグッドプラクティスではなく、Spring 'の魔法のパラダイムで中継しすぎることを心配していませんか?