본문 바로가기

SpringFramework Core - I. IoC 컨테이너/3. Bean 개관

3.2.3. 인스턴스 팩토리 메서드를 사용하여 인스턴스화 하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-class-instance-factory-method

 

 

static 팩토리 메서드와 유사하게, 인스턴스 팩토리 메서드를 통해 인스턴스화를 할때는 컨테이너에 존재하는 bean의 non-static 메서드를 호출한다. 이 메커니즘을 사용하려면, 인스턴스 메소드를 호출하여 생성될 bean들의 'class' 속성을 비워둬라. 그리고 'factory-bean' 속성에 인스턴스 메소드를 포함하고있는 bean(조상 컨테이너에 있어도 됨)의 이름을 적어라. 그리고 'factory-method' 속성에는 팩토리 메서드의 이름을 적어라. 다음 예시는 그런 bean을 어떻게 설정하는지 보여준다.

<!-- createInstance()라는 메서드를 포함한 팩토리 bean -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
	<!-- inject any dependencies required by this locator bean -->
</bean>


<!-- 팩토리 bean을 통해 생성되어야 하는 bean -->
<bean id="clientService"
      factory-bean="serviceLocator"
      factory-method="createClientServiceInstance" />

다음 예시는 일치하는 클래스를 보여준다.

public class DefaultServiceLocator {

    private static ClientService clientService = new ClientServiceImpl();
    
    public ClientService createClientServiceInstance() {
    	return clientService;
    }
}

팩토리 클래스에서는 하나 이상의 팩토리 메서드를 가지고 있어야 한다. 다음에서 그 예시를 보여준다.

<bean id="serviceLocator" class="examples.DefaultServiceLocator">
     <!-- 이 locator bean에 필요한 의존성을 주입하기 -->
</bean>


<bean id="clientService"
      factory-bean="serviceLocator"
      factory-method="createClientServiceInstance" />
      
<bean id="accountService"
      factory-bean="serviceLocator"
      factory-method="createAccountServiceInstance" />

다음 예시는 일치하는 클래스를 보여준다.

public class DefaultServiceLocator {

     private static ClientService clientService = new ClientServiceImpl();
     private static AccountService accountService = new AccountServiceImpl();
     
     public ClientService createClientServiceInstance() {
     	return clientService;
     }
     
     public AccountService createAccountServiceInstance() {
     	return accountService;
     }
}   

이러한 접근은, 팩토리 bean이 스스로 의존성 주입(DI)을 통해 관리되고 설정될 수 있다는 것을 보여준다. '의존성과 설정에 대한 상세'를 참고하라

 

※ 스프링 문서에서 "factory bean"은 스프링 컨테이너에서 설정되고, 인스턴스 또는 static 팩토리 메서드를 통해 객체를 만드는 bean을 의미한다. 대조적으로 FactoryBean(대문자가 사용됨을 주의하라)은 스프링에 특정된 FactoryBean을 말한다.