Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование методов-производителей, полей-производителей и методов закрытия в приложениях CDI

Метод-производитель генерирует объект, который затем может быть инъецирован. Как правило, методы-производители используются в следующих ситуациях:

  • Когда вы хотите инъецировать объект, который не является бином

  • Когда конкретный тип объекта для инъецирования может изменяться во время выполнения

  • Когда объект требует некоторой пользовательской инициализации, которую не выполняет конструктор бина

Для получения дополнительной информации о методах-производителях см. Инъецирование объектов с использованием методов-производителей.

Поле-производитель является более простой альтернативой методу-производителю. Это поле бина, которое генерирует объект. Его можно использовать вместо простого get-метода. Поля-производители особенно полезны для объявления ресурсов Java EE, таких как источники данных, ресурсы JMS и ссылки на веб-сервисы.

Метод-производитель или поле-производитель помечаются аннотацией javax.enterprise.inject.Produces.

Использование методов-производителей

Метод-производитель может позволить вам выбрать реализацию компонента во время выполнения, а не во время разработки или развёртывания. Например, в примере, описанном в Пример producermethods: использование метода producer-а для выбора реализации компонента, Managed-бин определяет следующий метод источника:

@Produces
@Chosen
@RequestScoped
public Coder getCoder() {

    switch (coderType) {
        case TEST:
            return new TestCoderImpl();
        case SHIFT:
            return new CoderImpl();
        default:
            return null;
    }
}

Здесь getCoder фактически становится get-методом, а когда свойство coder инъецируется с тем же квалификатором и аннотациями, что и метод, используется выбранная версия интерфейса.

@Inject
@Chosen
@RequestScoped
Coder coder;

Важно указать квалификатор: он сообщает CDI, какой Coder инъецировать. Без этого реализация CDI не сможет выбирать между CoderImpl, TestCoderImpl и вернувшейся getCoder и отменит развёртывание, сообщив пользователю о неоднозначности зависимости.

Использование полей-производителей для генерации ресурсов

Общее использование поля-производителя заключается в создании объекта, такого как JDBC DataSource или Java Persistence API EntityManager (для получения дополнительной информации см. главу 40 «Введение в API персистентности Java» ). Затем объект может управляться контейнером. Например, вы можете создать квалификатор @UserDatabase и затем объявить поле-производитель для entity manager-а следующим образом:

@Produces
@UserDatabase
@PersistenceContext
private EntityManager em;

Квалификатор @UserDatabase можно использовать, когда вы инъецируете объект в другой компонент, RequestBean, в другом месте приложения:

    @Inject
    @UserDatabase
    EntityManager em;
    ...

Пример producermethods: использование полей-производителей для создания ресурсов показывает, как использовать поля-производители для генерации EntityManager-а. Вы можете использовать аналогичный механизм для инъецирования объектов @Resource, @EJB или @WebServiceRef.

Чтобы свести к минимуму зависимость от инъецирования ресурса, укажите поле-производитель для ресурса в одном месте приложения, а затем инъецируйте объект в нужное вам место приложения.

Использование метода закрытия ресурса

Вы можете использовать метод-производитель или поле-производитель, чтобы сгенерировать объект, который необходимо удалить после завершения его работы. Если это так, вам нужен соответствующий метод закрытия, аннотированный @Disposes. Например, вы можете закрыть EntityManager следующим образом:

public void close(@Disposes @UserDatabase EntityManager em) {
    em.close();
}

Метод закрытия вызывается автоматически по окончании контекста (в данном случае в конце диалога, поскольку RequestBean имеет область видимости диалога), а параметр в методе close получает объект, созданный полем-производителем.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)