spring로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

spring로 검색한 결과
등록일:2008-03-16 16:14:56
작성자:
제목:Spring 생성자를 통한 의존성 주입


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

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

세터  주입의  경우에는  주입하고자  하는  특성을  <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  설정  파일의  명확하게  만들주기만  하면  된다.

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

[출처]  spring  생성자를  통한  의존성  주입|작성자  헐레벌떡
http://blog.naver.com/netspace?Redirect=Log&logNo=90009629537