객체간의 의존 관계는 생성자와 프로퍼티 설정의 2가지 방식으로 지정할 수 있다.

(1) 생성자 방식

JdbcDao.java


JdbcService.java


ExamMain.java


exam03.xml


결과


생성자를 통해 빈을 주입받는 경우는 <consturctor-arg>태그를 이용하여 처리한다.


빈(객체)를 주입(전달)받는 경우는 <consturctor-arg ref="..." />를 사용하며 기본 데이터 타입이나 String타입이라면 <consturctor-arg value="..." />를 사용한다. 즉 ref 대신 value를 사용한다.
또한, value로 전달된 값은 기본적으로 String 타입으로 처리한다.


<bean id="test" class="test.test.Test">
     <constructor-arg>
          <value>20</value>
     </consturctor-arg>
</bean>

<bean id="test" class="test.test.Test">
     <constructor-arg value="20" />
</bean>

<bean id="test" class="test.test.Test">
     <constructor-arg value="20" />
     <constructor-arg ref="jdbcDao" />
</bean>

<!-- <value>태그에 type 속성을 추가하면 직접 파라미터의 타입을 명시할 수도 있다. -->
<bean id="test" class="test.test.Test">
     <constructor-arg>
          <value type="long">2000</value>
     </consturctor-arg>
</bean>


(2) 프로퍼티 설정 방식
=> 프로퍼티 설정 방식은 setXXX( ) 형태의 설정 메서드를 통해서 필요한 객체와 값을 전달받는 방식이다.

IbatisDao.java


IbatisService.java


ExamMain.java


exam04.xml


결과


빈(객체)을 주입받을 경우에는 <property name="..." ref="ibatis" /> 이런식으로 ref 태그을 쓰고 기본 데이터 타입 및 String 타입의 경우는 value 태그를 사용한다.

<bean id="test" class="test.test.Test">
     <property name="exam01" value="10" />
     <property name="exam02" ref="service" />
</bean>

/** 프로젝트를 하다보면...생성자 방식보다 거의 프로퍼티 설정 방법을 사용하게 된다. **/


(3) XML 네임스페이스를 이용한 프로퍼티 설정
=> XML 네임스페이스를 이용하면 <property> 태그를 사용하지 않고 간단한 방법으로 프로퍼티 설정을 할 수 있다.

exam04_01.xml

네임스페이스를 사용하기 위해 http://www.springframework.org/schema/p를 작성해 줌.
접두어를 "p"로 설정했으며 사용방법은 "p:프로퍼티이름" 속성을 사용하여 프로퍼티 값을 설정하고, "p:프로퍼터이름-ref="...""속성을 사용하여 bean 객체를 프로퍼티에 전달할 수 있다.


(4) 임의 빈 객체 전달
=> 보통 <constructor-arg>, <property> 태그를 사용하여 다른 빈 객체를 전달받게 되는데 식별 값을 갖지 않는 빈 객체를 생성하여 전달할 수도 있다.

JdbcDao.java


JdbcService.java


ExamMain.java


exam05.xml


결과


여기서 주의할 점은 임의빈 객체는 식별 값(id혹은 name)을 갖지 않기 때문에, 해당 객체를 재사용할 수 없다.
(위의 예제에서는 보여주기 위해 id="dao"라는 식별 값 설정 : 작성해도 에러는 아님)
기본적으로 식별 값이 없기 때문에 재사용할 수 없으며 또한 위 소스처럼 식별 값을 작성했다 하더라도 그 객체를 다른곳에서 재사용할 수는 없다.
=>결과 창을 보면 defining beans [service]이렇게 나와 있는것처럼 스프링 컨테어너는 service라는 식별 값의 bean만 생성했다는 것을 알 수 있다. 그렇기 때문에 id="dao"이런식으로 식별 값을 준다하더라도 "dao"라는 식별 값을 다른곳에서 사용할 수 없는 것이다.


+ Recent posts