Spring IoC контейнер: обзор Bean, создание экземпляра Bean с использованием метода фабрики экземпляра
Подобно реализации через статический метод фабрики, создание экземпляра методом фабрики экземпляра вызывает нестатический метод существующего компонента из контейнера для создания нового компонента. Чтобы использовать этот механизм, оставьте атрибут class пустым и в атрибуте factory-bean укажите имя компонента в текущем (или родительском) контейнере, который содержит метод экземпляра, который должен быть вызван для создания объекта. Задайте имя самого фабричного метода с помощью атрибута factory-method. В следующем примере показано, как настроить такой компонент:
<!-- фабричный компонент, содержащий метод с именем createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- внедрить любые зависимости, требуемые этим bean-компонентом локатора -->
</bean>
<!-- компонент, создаваемый с помощью фабричного компонента -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
В следующем примере показан соответствующий класс:
Java
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
public ClientService createClientServiceInstance() {
return clientService;
}
}
Kotlin
class DefaultServiceLocator {
companion object {
private val clientService = ClientServiceImpl()
}
fun createClientServiceInstance(): ClientService {
return clientService
}
}
Один фабричный класс также может содержать более одного фабричного метода, как показано в следующем примере:
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- внедрить любые зависимости, требуемые этим bean-компонентом локатора -->
</bean>
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
<bean id="accountService"
factory-bean="serviceLocator"
factory-method="createAccountServiceInstance"/>
В следующем примере показан соответствующий класс:
Java
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;
}
}
Kotlin
class DefaultServiceLocator {
companion object {
private val clientService = ClientServiceImpl()
private val accountService = AccountServiceImpl()
}
fun createClientServiceInstance(): ClientService {
return clientService
}
fun createAccountServiceInstance(): AccountService {
return accountService
}
}
Этот подход показывает, что сам фабричный компонент может управляться и настраиваться посредством внедрения зависимостей (DI).
В документации Spring "фабричный бин" (“factory bean”) относится к бину, настроенному в контейнере Spring и создающему объекты с помощью экземпляра или статического фабричного метода. В отличие от этого, FactoryBean (обратите внимание на заглавную букву) относится к классу реализации FactoryBean, специфичному для Spring.
Читайте также:
- Spring IoC контейнер: обзор Bean, создание экземпляра Bean с помощью конструктора
- Spring IoC контейнер: обзор Bean, создание экземпляра Bean с помощью статического фабричного метода
- Spring IoC контейнер: обзор Bean, создание экземпляра Bean
Комментарии
Отправить комментарий