개발/Spring

[Spring] Ioc컨테이너와 DI(Dependency Injection) - 2

hojak99 2017. 8. 18. 14:01

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" />


반응형