Whiteship's Note


Great power comes great responsibility(Autowiring)



Autowiring이 매우 강력하기 때문에 그 만큼 강한 책임이 뒤따르게 된다는 표현입니다.[각주:1]
byName : bean의 이름과 bean이 설정되어야 할 속성이 이름이 같아야 합니다.
=> 만약에 속성의 이름을 변경하기로(리팩토링, 예를 들어 foo -> bar로) 결정했는데 bean의 이름을 변경하지 않았다면, ㄷㄷㄷ 거기에 더해서 혹시 bar라는 bean이 존재하고 있다면. 더욱 ㄷㄷㄷ;;

byType : 다들 아시다시피 같은 타입의 bean이 여러개 일 때 사용할 수가 없습니다.

constructor: byType과 마찬가지 입니다.

autodetect : 일단 byConstruct를 시도해보고, 그 다음에 byType을 시도 하기 때문에 위와 같은 상황에서UnsatisfiedDependencyException을 볼 수 있습니다.

무엇보다 가장 큰 단점은
"대체 뭐가 설정 된건지 알 수가 없다"
입니다.

그럼 사용하지 말아야 할까요??
글쎄요. 규약(Convention)이 잘 정의되어 있고, 잘 따르고 있는 집단에서는 사용하면 좋을 것 같습니다.
그런 집단이 아니더라도 자주 변동되지 않는 부분에 대한 bean 설정에서 byName으로 설정해 두면 XML도 간단해 지고 좋치 않을까 생각해 봅니다.
  1. 저 문장 혹시 스파이더맨1에 나오는 대사 아닌가요? 할머니가 스파이더맨한테.. [본문으로]
top


Autowiring

Spring/Chapter 3 : 2007.03.09 12:47


<bean /> 엘리먼트의 autowire 속성을 사용하여 bean들을 자동으로 묶을 수 있습니다. autowire에 지정할 수 있는 값은 다섯가지가 있습니다.

no : 기본값입니다. autowire를 사용하지 않겠다는 겁니다.
byName :  bean의 property 이름으로 다른 bean을 찾아서 연결합니다.
byType : bean의 property 타입으로 다른 bean을 찾아서 연결합니다. 같은 type의 bean이 여러개면 에러가 발생합니다.
constuctor : byType과 비슷한데 생성자에 있는 인자들의 Type으로 찾아서 연결합니다.
autodetect : constuctor 또는 byType으로 찾게 됩니다. default 생성자가 있으면 byType으로 찾는다는 군요.

명시적으로 <property /> 나 <constructor-arg /> 를 사용하여 종속성을 적어 줄 경우에는 autowiring으로 연결된 종속성을 overriding 합니다.
장점
1. configuration 파일의 크기를 줄여 줍니다.
2. 객체가 변하거나 추가 될 때 설정 파일의 많은 변경이 필요하지 않습니다.

단점
1. 너무 매직 스러움.
2. wiring 정보를 감춰져서 문서화 하는 도구에서 알아채질 못합니다.
3. type으로 wiring할 경우 애매한 상황이 조금이라도 발생하면 명시적으로 적어줘야 합니다.

Email 클래스를 추가하고 Member 당 하나의 Email 레퍼런스를 가지고 있습니다.

    <bean id="email" class="beanConfiguration.Email">
        <property name="type" value="google" />
        <property name="address" value="myemail@gmail.com" />
    </bean>

    <bean id="keesun5" class="beanConfiguration.Member" autowire="byName" />

Member 클래스에 setEmail(Email email) 메소드가 있기 때문에 email 이라는 이름의 bean을 찾아서 자동으로 엮어 줍니다.

    @Test public void autowiringByName(){
        Member keesun = (Member) bf.getBean("keesun5");
        Email email = keesun.getEmail();
        assertEquals("google", email.getType());
        assertEquals("myemail@gmail.com", email.getAddress());
    }



'Spring > Chapter 3' 카테고리의 다른 글

Bean's Life Cycle  (0) 2007.03.10
The IoC container  (0) 2007.03.10
3.5. Customizing the nature of a bean  (0) 2007.03.10
Singleton & Prototype  (0) 2007.03.09
3.4. Bean scopes  (0) 2007.03.09
Autowiring  (0) 2007.03.09
Collection Merging  (0) 2007.03.09
Collections - <list />  (0) 2007.03.08
Inner beans  (0) 2007.03.08
idref 엘리먼트  (0) 2007.03.08
Constructor Injection 할 때 인자 구분  (0) 2007.03.08
top