Spring Bean 생성자 파라미터 - Spring Bean saengseongja palamiteo

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>

Toplist

최신 우편물

태그