Java Spring [Di]

이정민·2021년 12월 14일
0

DI (Dependency Injection)

[의존성 주입]




Hello class


public class Hello {
   
   private Printer printer;
   
   public Hello() {
   
   }
   
   pubilc Hello(Printer p) {
      super();
      this.printer = p;
   }
   
   public Printer getPrinter() {
      return printer;
   }
   
   public void setPrinter(Printer printer) {
      this.printer = printer;
   }
   
   @Override
   public String toString() {
      return "Hello [printer=" + printer + "]";
   }
   
   public void print(String s) {
      printer.print(s);
   }
}
   

Hello 클래스에서 젤 밑에 있는 public void print(String s) 함수가 실행되기 위해서 Printer 클래스를 필요로 한다.
이런 상황에서 Hello 클래스는 Printer 클래스에 의존성을 가진다.




config.xml

<beans xmlns= '''' >

<bean id="mprinter" class="ljm.java.ui.MonoPrinter"></bean>
<bean id="cprinter" class="ljm.java.ui.ColorPrinter"></bean>

<bean id="hello" class="ljm.java.entity.Hello">
   <property name="printer" ref="mprinter"></property>
</bean>

</beans>

여기서 bean은 객체를 생성해준다.(MonoPrinter, ColorPrinter)

bean hello의 property에서 name="printer"는 setPrinter()메서드를 뜻하고 ref="mprinter는 setPrinter()메서드에 참조변수 mprinter을 인자로 넣어준다는 뜻

쉽게 요약하면
<bean id="mprinter" class="ljm.java.ui.MonoPrinter"></bean>
=> MonoPrinter mprinter = new MonoPrinter();

<property name="printer" ref="mprinter"></property>
=> hello.setPrinter(mprinter);




Printer(인터페이스), (Color,Mono)Printer

public interface Printer {
   void print(String msg);
}

===================
public class MonoPrinter implements Printer {
   
   @Override
   public void print(String msg) {
      System.out.println("---mono----");
      
      System.out.println(msg);
      
      System.out.println("---mono-end---");
   }
}

=================
<ColorPrintMono와 같음>



DiExam (main method)

public class DiExam {
   public static void main(String[] args) throws ClassNotFoundException {
      ApplicationContext context = new GenericXmlApplicationContext("ljm/java/test/config.xml");
   
      Hello hello = context.getBean(Hello.class);
   
      hello.print("hello");
   
      String[] beans = context.getBeanDefinitionNames();
   
      for(String b :beans) {
         System.out.println(b);
      }
   }
}
   
   
   // 실행결과
   
   ---mono----
   hello
   ------mono-end-----
   mprinter
   cprinter
   hello



DiExam코드 진행 과정

context가 ljm/java/test/config.xml 컨테이너 객체를 가르키게 한다.

Hello hello 참조변수가 Hello.class객체를 가리킨다.

  1. hello.print("hello"); 메서드를 실행시키면 setPrinter메서드에 mprinter매개변수를 인자로 넣어주고
    (인자 형태는 인터페이스 Printer이기 때문에 자손인 mprinter를 이용할 수 있다.)

  2. this.printer = printer;를 통하여 private Printer printer에 mprinter객체 주소를 printer에게 넘겨줘서 똑같은 객체를 가르키게 되고

  3. MonoPrinter의 객체를 가르키고 있는 printer.print(s);가 실행이 되어 위에서 봤던 결과가 나타난다.

profile
안녕하세요.

0개의 댓글