[ばね]中空注入、DI、依存注入
依存性
定義#テイギ#
クラスの関連
必要性
実際のコードストリームにオブジェクトを作成するのではなく、外部で生成されたオブジェクトをインポートして使用することで、クラス間の結合度を低減し、再利用性を向上させます.
オブジェクト向け設計の5つの原則
DIP (Dependency Inversion Principle)
「具体化に頼らず抽象化に頼る」
依存性を注入しない場合は、依存クラスが変更された場合、コードを変更する必要があります.ただし、抽象インタフェースに依存する場合は、コードを変更する必要はありません.
OCP (Open Closed Principle)
「拡張はオープンですが、境界は閉鎖されている必要があります.」
アプリケーションの女の子の使用分野と構成分野を区分します.つまり、上記のようにソフトウェア要素を拡張しても、使用領域の変更は閉じます.
依存関係の注入方法生成者注入 精子注入(setter注入) 現場注入 げんばちゅうにゅう
特長
コードが簡潔で、多くの開発者を引きつけているが、外部で変更できないため、テストが難しいという致命的な欠点がある.
DIフレームワークがないと、何もできません.
設定に使用するスプリング設定のみ.
Setterインジェクション(インジェクション修正者)
これはsetterというフィールド値を変更する方法で依存関係を注入する方法です.
特長
選択、変更可能な依存関係
これはjavabean property規約の修正者メソッドを使用する方法です.
コンストラクション関数は、空のオブジェクトを作成するときに必要なすべての依存オブジェクトに注入されるため、オブジェクトを使用するときに完全であってもよい.ただし、設定方法では、必要な依存オブジェクトを渡すために設定方法を使用する必要がなく、空のオブジェクトが生成されるため、オブジェクトを使用するときにNull PointerExceptionが発生する可能性があります.
・修正者注入を用いることは、OOPの5つの開発原則におけるオープン−クローズPrincipal(OCP)に違反する必要がない修正の可能性を開く.したがって,生成者を注入することで変更の可能性を排除し,不変性を保証することが望ましい.
インプラント作成者
空のオブジェクトを作成すると、すべての依存オブジェクトが注入されます.
ジェネレータ呼び出し時に一度だけ呼び出されることを保証します.
可変ではなく、必要な依存関係に使用されます.
またSpringフレームワークはコンストラクション関数注入も積極的にサポートしているので,@Autowiredを省略しても注入を容易に行うことができる.
コンストラクション関数注入を使用すると、フィールドオブジェクトでfinalキーを使用し、コンパイル時に欠落した依存性を確認できます.運転中に依存関係が動的に変化することはほとんどない.つまり、不変性を保障する効果がある.
循環参照エラー防止:アプリケーションが駆動する時点(オブジェクトの作成時点)で循環参照エラーを防止できます.たとえば、UserServiceImplの登録関数がMemberServiceのaddを呼び出し、MemberServiceImplのadd関数がUserServiceImplの登録関数を呼び出した場合、どうなりますか?上記の2つの方法は相互に呼び出され続け、メモリ内の関数のCallStackが蓄積され続け、StackOverflowエラーが発生します.これらの問題が見つからず、サーバが稼働している場合はどうなりますか?このメソッドを呼び出すと、StackOverflowエラーによりサーバが死亡します.しかし,構造関数注入を用いることで,この循環参照問題を防止できる.これは、アプリケーションドライバポイント(オブジェクトの作成ポイント)でエラーが発生したためです.これは、beanに登録するオブジェクトを作成するときに、次のループ参照が発生するためです.
定義#テイギ#
クラスの関連
class Person {
private Animal animal;
public String getPetName() {
return animal.name();
}
}
この場合,PersonオブジェクトはAnimalに依存する.動物の論理が流れているからだ.依存注入は、注入クラスが持つ関連関係です.必要性
実際のコードストリームにオブジェクトを作成するのではなく、外部で生成されたオブジェクトをインポートして使用することで、クラス間の結合度を低減し、再利用性を向上させます.
オブジェクト向け設計の5つの原則
DIP (Dependency Inversion Principle)
「具体化に頼らず抽象化に頼る」
依存性を注入しない場合は、依存クラスが変更された場合、コードを変更する必要があります.ただし、抽象インタフェースに依存する場合は、コードを変更する必要はありません.
OCP (Open Closed Principle)
「拡張はオープンですが、境界は閉鎖されている必要があります.」
アプリケーションの女の子の使用分野と構成分野を区分します.つまり、上記のようにソフトウェア要素を拡張しても、使用領域の変更は閉じます.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
名前の通り、フィールドに直接注入する方法です.特長
コードが簡潔で、多くの開発者を引きつけているが、外部で変更できないため、テストが難しいという致命的な欠点がある.
DIフレームワークがないと、何もできません.
設定に使用するスプリング設定のみ.
これはsetterというフィールド値を変更する方法で依存関係を注入する方法です.
特長
選択、変更可能な依存関係
これはjavabean property規約の修正者メソッドを使用する方法です.
コンストラクション関数は、空のオブジェクトを作成するときに必要なすべての依存オブジェクトに注入されるため、オブジェクトを使用するときに完全であってもよい.ただし、設定方法では、必要な依存オブジェクトを渡すために設定方法を使用する必要がなく、空のオブジェクトが生成されるため、オブジェクトを使用するときにNull PointerExceptionが発生する可能性があります.
インプラント作成者
空のオブジェクトを作成すると、すべての依存オブジェクトが注入されます.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
特長ジェネレータ呼び出し時に一度だけ呼び出されることを保証します.
可変ではなく、必要な依存関係に使用されます.
またSpringフレームワークはコンストラクション関数注入も積極的にサポートしているので,@Autowiredを省略しても注入を容易に行うことができる.
コンストラクション関数注入を使用すると、フィールドオブジェクトでfinalキーを使用し、コンパイル時に欠落した依存性を確認できます.運転中に依存関係が動的に変化することはほとんどない.つまり、不変性を保障する効果がある.
Reference
この問題について([ばね]中空注入、DI、依存注入), 我々は、より多くの情報をここで見つけました https://velog.io/@injoon2019/스프링-빈-주입-방식-DI-의존-관계-주입テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol