Inversion of Control
: 컨테이너에 대한 의존성은 낮추면서도, 컴포넌트들을 잘 엮어보기 위한 방법.
위의 그림에서 ServiceHelper.getHelloService()를 통해 HelloService를 찾았다고 하자.
HelloService는 Hello 인터페이스를 필드로 가지고 있고, Hello를 구현한 것은 HelloLab과
HelloWorld가 있다.
다음은 HelloService의 소스이다.
public class HelloService { private Hello hello; public void setHello(Hello h) { hello = h; } public String get() { return hello.get(); } }
setHello의 매개변수로 HelloLab이냐 HelloWorld냐에 따라서 get 메소드의 결과가 달라질
것이다. 그럼, setHello 메소드는 누가 무엇을 매개 변수로 호출할것인가?
spring 프레임워크에서는 다음과 같이 별도의 xml파일을 이용하여 지정해두면, 컨테이너가
이를 해석하여 초기화한다. 이러한 것을 dependency injection이라고 표현한다.
<beans> <bean id="helloLab" class="HelloLab"/> <bean id="helloWorld" class="HelloWorld"/> <bean id="helloService" class="HelloService"> <property name="hello"> <ref local="helloWorld"/> </property> </bean>
</beans>
위와 같이 set 메소드를 이용하는 방법외에 생성자를 이용하는 방법, 메소드를 이용하는 방법도 있다. |