DI 의 개념
각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말함
- 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다.
(xml, annotation)
- 객체 레퍼런스를 컨테이너로부터 주입 받아서, 실행 시에 동적으로 의존관계가 생성된다.
- 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해 주는 것이다.
DI 의 장점
- 코드가 단순해진다.
- 컴포넌트 간의 결합도가 제거된다.
DI의 유형으로 3가지가 있다.
1. Setter Injection
2. Constructor Injection
3. Method Injection
Setter Injection : Setter 메소드를 이용한 의존성 삽입
- 의존성을 입력 받는 setter 메소드를 만들고 이를 통해 의존성을 주입한다.
Constructor Injection : 생성자를 이용한 의존성 삽입
- 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
Method Injection : 일반 메소드를 이용한 의존성 삽입
- 의존성을 입력 받는 일반 메소드를 만들고 이를 통해 의존성을 주입한다.
Setter Injection
Hello -> (interface : Printer) <- ConsolePinter
beans.xml ↑StringPinter
위와 같은 상황에서 다음과 같은 코드를 작성할 수 있다.
[Hello.java] package bean; public class Hello { String name;
Printer printer; public Hello() { } public void setName(String name) { this.name = name; } public void setPrinter(Printer printer) { this.printer = printer; } }
[beans.xml]
<bean id="hello" class="bean.hello">
<property name="name" value="Spring" />
<property name="printer" ref="printer" />
</bean>
<bean id="printer" class="bean.StringPrinter" />
<bena id="consolePrinter" class ="bean.ConsolePrinter />
Constructor Injection
Hello -> (interface : Printer) <- ConsolePinter
beans.xml ↑StringPinter
위와 같은 상황에서 다음과 같은 코드를 작성할 수 있다.
[Hello.java] package bean; public class Hello { String name;
Printer printer; public Hello() { } public Hello(String name, Printer printer) { this.name = name; this.printer = printer; } }
[beans.xml]
<bean id="hello" class="bean.Hello">
<constructor-arg index="0" value="Spring" />
<constructor-arg index="1" value="printer" />
</bean>
<bean id="printer" class="bean.StringPrinter" />
<bean id="consolePrinter" class="bean.ConolePrinter" />