Spring-의존성 주입
모든 Java 기반 응용 프로그램에는 최종 사용자가 작동하는 응용 프로그램으로 보는 것을 표시하기 위해 함께 작동하는 몇 가지 개체가 있습니다. 복잡한 Java 애플리케이션을 작성할 때 애플리케이션 클래스는 다른 Java 클래스와 최대한 독립적이어야 이러한 클래스를 재사용하고 단위 테스트 중에 다른 클래스와 독립적으로 테스트 할 수 있습니다. 종속성 주입 (또는 배선이라고도 함)은 이러한 클래스를 함께 붙이고 동시에 독립적으로 유지하는 데 도움이됩니다.
텍스트 편집기 구성 요소가 있고 맞춤법 검사를 제공하려는 응용 프로그램이 있다고 가정합니다. 표준 코드는 다음과 같습니다.
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
여기서 우리가 한 것은 TextEditor와 SpellChecker 사이에 의존성을 생성하는 것입니다. 반전 제어 시나리오에서 우리는 대신 다음과 같이 할 것입니다.
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
여기서 TextEditor는 SpellChecker 구현에 대해 걱정할 필요가 없습니다. SpellChecker는 독립적으로 구현되며 TextEditor 인스턴스화 시점에 TextEditor에 제공됩니다. 이 전체 절차는 Spring Framework에 의해 제어됩니다.
여기서는 TextEditor에서 전체 제어를 제거하고 다른 곳에 보관했습니다 (예 : XML 구성 파일). 종속성 (예 : SpellChecker 클래스)이 TextEditor 클래스에 삽입됩니다. Class Constructor. 따라서 일부 외부 시스템에 대한 종속성을 효과적으로 위임했기 때문에 제어 흐름이 DI (Dependency Injection)에 의해 "반전"되었습니다.
의존성을 주입하는 두 번째 방법은 Setter MethodsSpellChecker 인스턴스를 생성 할 TextEditor 클래스의 이 인스턴스는 Setter 메서드를 호출하여 TextEditor의 속성을 초기화하는 데 사용됩니다.
따라서 DI는 두 가지 주요 변형으로 존재하며 다음 두 하위 장에서는 두 가지를 예제로 다룹니다.
Sr. 아니. | 의존성 주입 유형 및 설명 |
---|---|
1 | 생성자 기반 종속성 주입 생성자 기반 DI는 컨테이너가 각각 다른 클래스에 대한 종속성을 나타내는 여러 인수를 사용하여 클래스 생성자를 호출 할 때 수행됩니다. |
2 | Setter 기반 종속성 주입 Setter 기반 DI는 빈을 인스턴스화하기 위해 인수없는 생성자 또는 인수없는 정적 팩토리 메서드를 호출 한 후 빈에서 setter 메서드를 호출하는 컨테이너에 의해 수행됩니다. |
생성자 기반 및 Setter 기반 DI를 모두 혼합 할 수 있지만 필수 종속성에는 생성자 인수를 사용하고 선택적 종속성에는 setter를 사용하는 것이 좋습니다.
코드는 DI 원칙에 따라 더 깨끗하고 디커플링은 객체에 종속성이 제공 될 때 더 효과적입니다. 객체는 종속성을 조회하지 않으며 종속성의 위치 나 클래스를 알지 못하며 모든 것이 Spring Framework에서 처리됩니다.