Spring IoC - DI (Dependency Injection)

2010. 8. 15. 18:01plming/Java - Spring

클래스 사이의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것.
빈 설정 파일(저장소 관리 파일)에서 의존관계가 필요하다는 정보를 추가하기만 하면된다.

Spring 프레임워크는 각 클래스 사이의 의존관계를 관리하기 위한 방법으로 Setter Injection, Constructor Injection, Method Injection의 세 가지 유형으로 처리하고 있다.


- Setter Injection
  클래스 사이의 의존관계를 연결시키기 위하여 setter 메소드를 이용하는 방법

 import net.javajigi.user.dao.UserDAO;

 import org.springframework.beans.factory.InitializingBean;

 public class UserServiceImpl implements UserService, InitializingBean {
     private UserDAO userDAO;

     public void setUserDAO(UserDAO newUserDAO) {
         this.userDAO = newUserDAO;
     }



 applicationContext.xml

 <beans>
     <bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO">
         <property name="dataSource">
             <ref local="dataSource"/>
         </property>
     </bean>

     <bean id="userService" class="net.javajigi.user.service.UserServiceImpl">
         <property name="userDAO">
             <ref local="userDAO"/>
         </property>
     </bean>


<property /> 엘리먼트 이름이 userDAO라면
UserServiceImpl 클래스의 setUserDAO() 메소드를 통하여 MySQLUserDAO 인스턴스를 전달하게 된다.

※ 빈 설정 파일(applicationContext.xml)은 org.springframework.beans.factory.xml.XmlBeanFactory에 의해 초기화되어 사용하는 것이 가능하다.


- Constructor Injection
  생성자를 이용하여 의존관계를 연결시킨다

 import net.javajigi.user.dao.UserDAO;

 import org.springframework.beans.factory.InitializingBean;

 public class UserServiceImpl implements UserService, InitializingBean {
     private UserDAO userDAO;

     public UserServiceImpl(UserDAO newUserDAO) {
         this.userDAO = newUserDAO;
     }



 applicationContext.xml

 <beans>
     <bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO">
         <property name="dataSource">
             <ref local="dataSource"/>
         </property>
     </bean>

     <bean id="userService" class="net.javajigi.user.service.UserServiceImpl">
         <constructor-arg>
             <ref local="userDAO"/>
         </constructor-arg>

     </bean>



- Method Injection
   Spring 프레임워크 1.1 버전에서 새롭게 지원
   Spring 프레임워크는 Singleton 인스턴스와 Non Singleton 인스턴스의 의존관계를 연결시킬 필요가 있을 때 사용하므로, 사용하는 빈도수가 많지 않다.


[출처] Spring 프레임워크 워크북