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;
public void setSong(String song){
this.song = song;
}
@Autowired
생성자, property, method 모두 적용 가능
'type' 을 이용하여 의존 관계 자동 설정
@Autowired가 property에 직접 적용되면 setter 없어도 수행 가능
default 생성자(인자 없는 생성자)가 생성된 후 주입되므로 default생성자 반드시 정의.
public class Instrumentalist implements Performer {
private String song; //직접 적용하면 setter 굳이 필요 없음
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{
"OneManBand") // @Qualifier("OneManBand")가 적용된 클래스(객체)를 모두 주입 (
private Collection<Instrument> instruments;
}
}
@Value
단순 값 전달
SpEL 사용 가능
@Resource
필요한 자원(객체) 직접 지정, 검색 후 DI 실행
public class Instrumentalist implements Performer{
name="guitar") // id가 guitar인 객체 찾아 주입 (
private Instrument mainInstrument;
...
}
//xml
<bean id="guitar" class=".....Guitar />
name 속성이 생략되면 property 이름 사용(auto-wiring by name)
public class Instrumentalist implements Performer{
// id가 piano인 객체 찾아 주입
private Instrument piano;
...
}
@Component
자동 bean 등록
"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 |