私は1年余りの間Spring Bootで開発してきましたが、Autowiredコンストラクターを使用する利点をまだ理解していないので、誰かが私にこれを説明できるかどうか、そして何がベストプラクティスと見なされるかについて考えていました。
次のような豆があるとします
@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コンテナーに緊密にバインドされており、クラスはそれなしでは機能しません。