티스토리 뷰
728x90
반응형
XML파일 중 bean의 <construct-arg> 요소에 지정된 생성자 인자를 빈(Bean) 클래스의 생성자에 지정된 생성자 인자와 연결하는 방법을 알아 보겠습니다.
Case 01 - 형식을 기준으로 한 생성자 인자 연결
- <construct-arg> 요소의 index 특성을 지정하지 않은 경우 스프링 컨테이너는 <construct-arg> 요소에 지정된 형식과 빈 클래스의 생성자에 지정된 인자의 형식을 비교하여 호출할 생성자를 찾습니다.
Case 02 - 고유한(상속되지 않은) 빈을 지정하는 생성자 인자
- 아래 예제에서는 ServiceTemplate Class의 생성자 인자의 순서와 XML에서의 생성자 인자의 순서가 일치하지 않는것을 알 수 있습니다.
- 하지만 실행 시 스프링 컨테이너가 serviceTemplate 빈의 인스턴스를 정상적으로 생성할 수 있습니다.
- 그 이유는 ServiceTemplate Class의 생성자 생성 시 인자로 넘겨주는 해당 클래스가 기본적으로 고유하므로 스프링 컨테이너는 별 어려움 없이 그 의존성을 올바른 순서대로 주입할 수 있습니다.
ServiceTemplate Class
public class ServiceTemplate {
public ServiceTemplate(JmsMessageSender jmsMessageSender,
EmailMessageSender emailMessageSender,
WebServiceInvoker webServiceInvoker) {
.....
}
}
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg ref="emailMessageSender"/>
<constructor-arg ref="jmsMessageSender"/>
<constructor-arg ref="webServiceInvoker"/>
<bean>
<bean id="emailMessageSender" class="example.EmailMessageSender">
<bean id="jmsMessageSender" class="example.JmsMessageSender">
<bean id="webServiceInvoker" class="example.WebServiceInvoker">
Case 03 - 연관된(상속) 빈을 지정하는 생성자 인자
- BBean은 ABean의 하위 클래스 입니다.
- aBean 및 bBean 빈은 상속으로 연관되므로 스프링 컨테이너는 ServiceTemplate 클래스의 빈 정의에 <constructor-arg> 요소가 선언된 순서대로 생성자 인자를 ServiceTemplate 클래스의 생성자 인자에 적용되게 됩니다.
- 즉 XML파일 구성대로 첫번째에는 aBean이 두번째에는 aBean이 할당되게 됩니다.
- 이러한 경우 <constructor-arg> 요소의 index 또는 type 특성을 사용해 <constructor-arg> 요소가 적용되는 생성자 인자를 지정할 수 있습니다.
public class ServiceTemplate {
public ServiceTemplate(ABean aBean, BBean bBean) {
.....
}
}
// 오류가 발생하는 빈 정의
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg ref="bBean"/>
<constructor-arg ref="aBean"/>
<bean>
// 오류가 발생하지 않는 빈 정의
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg type="example.BBean" ref="bBean"/> // 또는 index 1
<constructor-arg type="example.ABean" ref="aBean"/> // 또는 index 0
<bean>
<bean id="aBean" class="example.ABean">
<bean id="bBean" class="example.BBean">
Case 04 - 표준 자바 형식 및 사용자 지정 형식을 지정하는 생성자 인자
- 생성자 인자 형식이 기본 형식(int, float, long 등), String 형식 또는 사용자 지정 형식(ex: Address)인 경우 <constructor-arg> 요소의 value 특성으로 값을 지정할 수 있습니다. 그런데 value 특성으로 지정한 값이 두 개 이상의 생성자 인자로 변환할 수 있는 경우 스프링 컨테이너가 생성자 인자의 형식을 유추할 수 없게 됩니다.
- 예를 들어 값이 int, long 중 어떤 형식인지 알 수 없는 경우가 발생하게 됩니다.
- 아래 예제에서는 ServiceTemplate Class의 생성자 인자에서는 String, boolean, long, int 순서대로 값을 할당 받고 있지만 XML 파일에서는 String, boolean, int, long의 순서대로 값을 할당하도록 했습니다.
- 이때 스프링 컨테이너는 XML파일의 <constructor-arg>의 순서대로 값을 할당하게 되며 ServiceTemplate Class는 잘못된 값을 할당 받게 됩니다.
- 이러한 경우 해결책으로는 type 특성을 사용하여 인자의 형식을 지정할 수 있습니다.
public class ServiceTemplate {
public ServiceTemplate(String url, boolean active, long timeout, int maxNumber) {
.....
}
}
// 잘못된 <construct-arg>의 순서로 ServiceTemplate Class의 생성자에게 값 전달
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg ref="naver.com"/>
<constructor-arg ref="true"/>
<constructor-arg ref="5"/> // maxNumber에 값 할당
<constructor-arg ref="200"/> // timeout에 값 할당
<bean>
// type 특성으로 생성자 인자 형식을 지정하여 스프링 컨테이너는 형식을 비교하여 올바르게 적용할 수 있다.
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg type="String" ref="naver.com"/>
<constructor-arg type="boolean" ref="true"/>
<constructor-arg type="int" ref="5"/> // maxNumber에 값 할당
<constructor-arg type="long" ref="200"/> // timeout에 값 할당
<bean>
Case 05 - 이름을 기준으로 한 생성자 인자 연결
- <constructor-arg> 요소의 name 특성에는 <constructor-arg> 요소가 적용되는 생성자 인자의 이름을 지정할 수 있습니다.
- 아래 구성은 ServiceTemplate 클래스를 컴파일할 때 디버그 플래그를 할성화해야 제대로 작동합니다.
- 디버그 플래그를 활성화하지 않고 컴파일하면 컴파일 중에 생성자 인자 이름이 손실되므로 스프링이 <constructor-arg> 요소의 name 특성에 지정된 생성자 인자 이름에 해당하는 생성자 인자를 찾을 수 없게 됩니다.
public class ServiceTemplate {
public ServiceTemplate(String url, boolean active, long timeout, int maxNumber) {
.....
}
}
<bean id="serviceTemplate" class="example.ServiceTemplate">
<constructor-arg name="url" ref="naver.com"/>
<constructor-arg name="active" ref="true"/>
<constructor-arg name="maxNumber" ref="5"/>
<constructor-arg name="timeout" ref="200"/>
<bean>
728x90
반응형
'JAVA > Spring' 카테고리의 다른 글
Spring - XML 빈 설정 중 properties 사용하기 (0) | 2021.10.25 |
---|---|
Spring - XML Collection List, Set, Map, Property 사용 방법 (0) | 2021.10.18 |
Spring - 빈의 범위(Bean Scope) (0) | 2021.10.17 |
Spring - naverEmail 또는 gmail로 이메일 발송하기 (0) | 2021.07.08 |
Spring - 빈 스코프란? (0) | 2021.04.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- JDK Dynamic Proxy와 CGLIB의 차이
- 자바 백엔드 개발자 추천 도서
- transactional outbox pattern spring boot
- 트랜잭셔널 아웃박스 패턴 스프링부트
- redis sorted set
- spring boot redisson destributed lock
- 레이어드 아키텍처란
- redis sorted set으로 대기열 구현
- 람다 표현식
- spring boot excel download oom
- spring boot excel download paging
- spring boot redisson 분산락 구현
- redis 대기열 구현
- java ThreadLocal
- 서비스 기반 아키텍처
- spring boot redis 대기열 구현
- spring boot poi excel download
- spring boot redisson sorted set
- microkernel architecture
- pipeline architecture
- service based architecture
- transactional outbox pattern
- space based architecture
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- polling publisher spring boot
- java userThread와 DaemonThread
- 공간 기반 아키텍처
- @ControllerAdvice
- pipe and filter architecture
- spring boot 엑셀 다운로드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함