자바에서는 클래스는 하나 이상의 생성자를 가질수 있다생성자를 이용하여 해당 빈을 속성값을 셋팅할수 있다.

생성자를 통해 속성값을 셋팅하는 것은 강한 의존성을 가지는 반면세터를 이용하여 셋팅하는 것은 어떤 속성이 필수인지 아닌지를 설정할 수가 없는 점이 발생한다.

세터 주입의 경우에는 주입하고자 하는 특성을 <property> 요소를 사용하여 정의했다.

생성자 주입의 경우도 마찬가지인데다만 빈이 인스턴스화될때 생성자에 전달할 인자를 <bean>  하위요소로서 <constructor-arg> 사용하여 지정한다는 점이 다르다.

또한 <constructor-arg> <property> 요소와는 달리 name 속성을 갖지 않는다

 

다음은 생성자 주입을 사용하는 설정예제이다.

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<value>42</value>

</constructor-arg>

</bean>

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<ref bean = "bar" />

</constructor-arg>

</bean>

 

모호한 생성자 인자의 처리

 

만약 생성자의 인자들의 값들이 동일한 타입이라면 어떤 인자에 어떤값을 넣을지 Spring 컨테이너는 어떻게   있을까?

 

예제를 보면

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg>

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg>

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

 

빈에서는 다음과 같이…

 

public class Foo {

Public Foo(String arg1, java.net.URL arg2){

...

}

}

 

이라는 가정하에서 보자.

Spring 빈을 묶을   인자값을 어떻게 할당할까요?

답은 spring  org.springframework.beans.factory.UnsatisfiedDependencyException 던져 사용자에게 생성자의 인자에 모호함을 알려준다.

생성자 인자를 다룰  있는 방법에는 2가지 존재하는데 하나는 색인을 이용하는 것과 타입을 이용하는 것이다.

 

1. Index 이용

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg   index = "1">

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg   index = "0">

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

Index 0 부터 시작이다 0번이 첫번째 인자값에 할당 되고 1번째가 두번째 인자값에 할당된다.

 

2. Type 이용

 

<bean id = "foo"

class="com.springinaction.Foo">

<constructor-arg   type = "java.lang.String">

<value>http://www.maning.com </value>

</constructor-arg>

<constructor-arg   type = "java.net.URL">

<value>http://www.springinaction.com </value>

</constructor-arg>

</bean>

 

인자에 맞는 형에 할당되어진다만약 같은 형이 2 이상 존재한다면 반드시 index 이용해야 한다.

 

생성자와 세터 비교

 

1. 생성자의 장점

생성자 주입은 강한 의존성 계약을 강제한다요컨데빈은 모든 의존성에 대해 총족되지 않으면 인스턴스화될  없다일단 인스턴스화되면 빈은 완벽하게 유효하며 즉시 사용 가능한 상태가 된다물론 이는 빈의 생성자가 빈의 모든 의존성에 해당하는 파라미터 목록을 갖고 있다는 가정하에 그렇다.

빈의 모든 의존성이 생성자를 통해 설정되기 때문에불필요한 세터 메소드를 가질 필요가 없다이는 코드의 양을 최소로 유지시켜주는 장점이 있다.

오직 생성자를 통해서만 특성을 설정할  있도록 함으로써자연히  특성을 변경되지 않는 특성이 되는 효과가 있다.

 

2. 생성자의 단점

- 빈이 여러 개의 의존성을 갖는 경우에는 생성자의 파라미터 목록이 매우 길어진다.

유효한 객체를 구성하는 다양한 방법이 존재한다면오직 파라미터의 수와 타입에 의해 생성자의 시그니처(signature) 다양해질 것이므로 특정한 생성자를 식별하기가 어려워진다.

만약 생성자가 동일한 타입의 두개 이상의 파라미터를 취한다면 파라미터의 목적을 파악하기 어려워질 것이다.

생성자 주입은  자체로 즉시 상속에서 사용할  없다부모 객체의 private 특성을 설정하기 우해서는 빈의 생성자에서 항상 파라미터를 super() 넘겨야  것이다.

 

세터와 생성자중 어느것을 선택해도 상관이 없다가장 좋은 방안은 spring 설정 파일의 명확하게 만들주기만 하면 된다.

참고로 위의 장단점을 파악하여 좋은것을 취하는 방법이 우선적으로 하고 단점이 생기지 않도록 설정파일을 만들면 될것 같다.


출처 - http://www.jakartaproject.com/board-read.do?boardId=jsptip&boardNo=122000236700501&command=READ&t=1352791540902




Posted by linuxism
,