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.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки