gwangh91 / mailProject

0 stars 0 forks source link

DIについて調査し、「@Autowired」ではなくコンストラクタで注入することに変更 #2

Closed Akaota closed 6 months ago

gwangh91 commented 6 months ago

DIについて調査

DIとは 依存関係注入(Dependency Injection)の略語で、あるオブジェクトが使用する依存オブジェクトを内部で生成するのではなく、外部から注入して使用すること

依存性注入の3つの方法

  1. フィールド注入(Field Injection) @Component public class Juice { @Autowired private Orange orange; }

  2. セッター注入(Setter Injection) @Component public class Milk { private Cereal cereal;

    @Autowired public void setCereal(Cereal cereal) { this.cereal = cereal; } }

  3. 生成者注入(Constructor Injection) @Component public class Water { private final TeaBag teaBag;

    public Water(TeaBag chamomile) { this.teaBag = chamomile; } }

生成者注入を使用理由 1.明示的な依存性表現 クラスがどのような依存性を必要とするかを明確に表現できる

2.不変性 クラスの依存性が変更されない

3.テストのしやすさ テストコードで簡単に依存性をmockまたはfakeオブジェクトに置き換えることができる

4.循環依存性防止 循環依存性とは、2つ以上のオブジェクトが互いに依存する状況を意味し、これはランタイム時のアプリケーションの初期化に問題を引き起こす可能性がある

5.NullPointerException防止 生成者注入を使用すると、必須の協力者がセットされていない状態では生成すらできなくなる。

プロジェクトに適用(変更済) 下記のファイルで@Autowiredを使っているところに上記の「3. 生成者注入(Constructor Injection)」に変更 MailController.java MailService.java