Computer Science/Spring

#3 Spring DI : auto-wiring, annotation 기반

꿈꾸는어린이 2018. 5. 14. 15:20


Spring DI - auto-wiring, annotation 기반

Auto-wiring

  • DI 명시적 설정 안해도 bean의 Type이나 Name 이용하여 container가 DI를 자동 수행

  • autowire 속성 이용하여 지정


byName

  • setter injection

  • property와 같은 name(id) 선택하여 주입

  <bean id="instrument" class="...Saxophone" />
<bean id="kenny" class="...Instrumentalist">
<property name="song" value="Jingle Bells"/>
<property name="instrument" value="instrument" />
</bean>

위의 코드를 autowire 속성 이용하여 자동 주입

  <bean id="kenny" class="...Instrumentalist"
autowire="byName">
<property name="song" value="Jingle Bells"/>
</bean>


byType

  • setter injection

  • property와 같은 type 갖는 bean을 찾아 주입.

  • byType은 의존객체가 하나만 존재할 때 사용이 가능

  <bean id="saxophone" class="...Saxophone" />
<bean id="kenny" class="...Instrumentalist">
<property name="song" value="Jingle Bells"/>
<property name="instrument" ref="saxophone" />
</bean>

위의 코드를 autowire 속성 이용하여 자동 주입, 여기서 Saxophone은 유일한 객체

  <bean id="kenny" class="...Instrumentalist"
autowire="byType">
<property name="song" value="Jingle Bells"/>
</bean>


constructor

  • constructor injection

  • byType처럼 type으로 선택하지만 생성자를 통해 주입

  <bean id="saxophone" class="...Saxophone" />
<bean id="kenny" class="...Instrumentalist">
<constructor-ref="saxophone" />
</bean>

Instrument 타입의 인자를 갖는 생성자가 존재하고,

Saxophone bean이 유일한 Instrument type 객체일 때 생성자 통해 주입

  <bean id="kenny" class="...Instrumentalist"
autowire="constructor">
</bean>

  • byType과 constructor은 할당가능한 Type의 bean이 여러 개일 경우 exception이 발생함

  • 따라서 Auto-wiring은 특정 타입의 bean 객체가 한개씩만 존재할 경우에 효과적.



Annotation 기반 처리

  • <context:annotation-config /> : annotation 처리에 필요한 모든 BeanPostProcess들을 자동으로 등록시킴

  • <context:component-scan /> : <context:annotation-config /> 기능 포함, annotation 이용한 자동 bean 검색


@Required

  • setter method 앞에 사용

  • property 값이 필수적으로 설정되어야 함을 의미

      public class Instrumentalist implements Performer {
       private String song;
       @Required
       public void setSong(String song){
         this.song = song;
      }


@Autowired

  • 생성자, property, method 모두 적용 가능

  • 'type' 을 이용하여 의존 관계 자동 설정

  • @Autowired가 property에 직접 적용되면 setter 없어도 수행 가능

  • default 생성자(인자 없는 생성자)가 생성된 후 주입되므로 default생성자 반드시 정의.

  public class Instrumentalist implements Performer {
   @Autowired private String song; //직접 적용하면 setter 굳이 필요 없음
   
   @Autowired
   public void setSong(String song){
     this.song = song;
  }
 
 
//xml 설정 파일
 <bean id="kenny" class="...Instrumentalist">
<property name="song" ref="yesterday"/> // 자동 주입, 명시적 DI 설정 필요 없음 -> 생략 가능
</bean>


@Qualifier

  • 자동 주입 가능한 의존 객체가 여러개 존재할 때, 특정객체를 선택하도록 지정

  public class OneManBand implements Performer{
   @Autowired
   @Qualifier("OneManBand") // @Qualifier("OneManBand")가 적용된 클래스(객체)를 모두 주입
   private Collection<Instrument> instruments;
  }
}


@Value

  • 단순 값 전달

  • SpEL 사용 가능


@Resource

  • 필요한 자원(객체) 직접 지정, 검색 후 DI 실행

  public class Instrumentalist implements Performer{
 @Resource(name="guitar") // id가 guitar인 객체 찾아 주입
 private Instrument mainInstrument;
...
}

//xml
<bean id="guitar" class=".....Guitar />
  • name 속성이 생략되면 property 이름 사용(auto-wiring by name)

  public class Instrumentalist implements Performer{
 @Resource // id가 piano인 객체 찾아 주입
 private Instrument piano;
...
}


@Component

  • 자동 bean 등록

  @Componet("guitar")
사용하면 다음과 같은 명시적 <bean>설정 생략 가능
<bean id="guitar" class=".....Guitar />


@Inject

= @Autowired


@Named

= @Component, @Qualifier

'Computer Science > Spring' 카테고리의 다른 글

#5 Spring MVC 구조  (0) 2018.05.25
#4 Bean 객체의 life-cycle 관리  (0) 2018.05.14
#2 Spring DI - xml 기반  (0) 2018.05.14
#1 Spring Framework  (0) 2018.05.13
Maven(메이븐)이란?  (0) 2018.03.12