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을 말한다.
'SpringFramework Core - I. IoC 컨테이너 > 3. Bean 개관' 카테고리의 다른 글
3.2.2. static 팩토리 메서드로 인스턴스화 하기 (0) | 2020.03.15 |
---|---|
3.2.1. 생성자로 인스턴스화 하기 (0) | 2020.03.15 |
3.2. Bean 인스턴스화 하기 (0) | 2020.03.15 |
3.1.1. Bean 정의 외부의 Bean에게 alias 붙이기 (0) | 2020.03.13 |
3.1. Bean에 이름 붙이기 (0) | 2020.03.13 |