[의존성 주입]
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 클래스에 의존성을 가진다.
<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);
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---");
}
}
=================
<ColorPrint도 Mono와 같음>
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
context가 ljm/java/test/config.xml 컨테이너 객체를 가르키게 한다.
Hello hello 참조변수가 Hello.class객체를 가리킨다.
hello.print("hello"); 메서드를 실행시키면 setPrinter메서드에 mprinter매개변수를 인자로 넣어주고
(인자 형태는 인터페이스 Printer이기 때문에 자손인 mprinter를 이용할 수 있다.)
this.printer = printer;를 통하여 private Printer printer에 mprinter객체 주소를 printer에게 넘겨줘서 똑같은 객체를 가르키게 되고
MonoPrinter의 객체를 가르키고 있는 printer.print(s);가 실행이 되어 위에서 봤던 결과가 나타난다.